하지만, 하나의 예는 다음과 같습니다 배열의 주소를 복용
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*
함수 매개 변수로 포인터를받는 경우
, 당신은 함수 내에서 캐스팅해야한다 : 외부 소스로부터 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;
}
, 당신은 어떻게 든 얼마나 많은 알고해야 바이트 (또는 int 등)는 포인터를 통해 액세스하는 것이 안전합니다. 데이터는 특수한 값 (예 : 0
또는 기타 끝)으로 구분되거나 포인터를 통해 메모리에 안전하게 액세스하려면 개수 또는 바이트/요소가 필요합니다.
// 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 다양한 포인터 운영에 더 많은 예제가 있습니다
업데이트
다음은 C로 구현 관리되지 않는 함수를 호출하는 예입니다. 또한 배열을 마샬링하는 또 다른 article이 있습니다.
어떻게 C#에서 포인터를 가져 옵니까? 'int *'로 시작할 수도 있고, 그렇지 않으면 그것을 받아야한다. 'void *'를 받았다면 그것을 사용할 수 있도록 캐스트해야합니다. – xxbbcc
정확하게 그 이유를 설명해 주시겠습니까? 또한 C# 형식 시스템에는 고정 된 크기의 배열이 없습니다. – svick
@xxbbcc 및 : 나는 int 포인터에 대한 void 포인터를 캐스팅 할 수 있다는 것을 알고 있지만 고정 길이 배열에 캐스트하려고합니다. 고정 길이 배열을 입력으로 사용하는 표준 제 3 자 라이브러리 함수가있는 경우 가끔 필요합니다. 예 : void standardFunction (int []). 이 함수에 정수 포인터 만 전달할 수는 없습니다. – genonymous