Я не совсем уверен, что это то, что вы ищете, но один пример будет выглядеть так:
int[] items = new int[10];
unsafe
{
fixed (int* pInt = &items[0])
{
// At this point you can pass the pointer to other functions
// or read/write memory using it.
*pInt = 5;
}
}
При принятии адрес массива, вы должны принять адрес первый элемент в массиве - следовательно, &items[0]
в приведенном выше примере.
Если вы получаете указатель в качестве параметра void*
функции, вы должны бросить его внутри функции:
public static unsafe void F (void* pMem)
{
int* pInt = (int*) pMem;
// Omitted checking the pointer here, etc. This is something
// you'd have to do in a real program.
*pInt = 1;
}
Если вы получаете void*
от внешнего источника, вы должны каким-то образом узнать, сколько байты (или int и т. д.) безопасны для доступа через указатель. Данные могут быть разделены специальным значением (например, завершение 0
или что-то еще), или вам понадобится счет или байты/элементы для безопасного доступа к памяти через указатель.
Update
Вот пример вызова неуправляемых функций реализованы в C:
// Function declaration in C
#define EXPORTFUNC __declspec(dllexport)
#define MYDLLAPI __declspec(nothrow) WINAPI
EXPORTFUNC int MYDLLAPI MyFunc1 (byte* pData, int nDataByteCount);
// Import function in C#
[DllImport ("My.dll")]
private static extern int MyFunc1 (byte* pData, int nDataByteCount);
// Call function with data (in unsafe class/method)
byte[] byData = GetData (...); // returns byte array with data
fixed (byte* pData = byData)
{
int nResult = MyFunc1 (pData, byData.Length);
...
}
MSDN имеет больше примеров различных операций с указателями. Кроме того, вот еще article о маршалинговых массивах.
Как вы получаете указатель на C#? Вы можете начать с 'int *' или вы должны получить его как таковой. Если вы получите 'void *', вам нужно будет использовать его, чтобы использовать его. – xxbbcc
Не могли бы вы объяснить, почему именно вы хотите это сделать? Кроме того, я считаю, что система типа C# не имеет фиксированных массивов. – svick
@xxbbcc и: Я понимаю, что могу наложить указатель на указатель на указатель на int, однако я хочу, чтобы это было выполнено в массив фиксированной длины. Иногда это становится необходимым, когда есть некоторая стандартная функция сторонней библиотеки, которая принимает массив фиксированной длины как входной. например void standardFunction (int []). Я не могу передать только целочисленный указатель на эту функцию. – genonymous