- ベストアンサー
C#でポインタのポインタを作りたい
- C#でポインタのポインタを作成する方法について教えてください。
- C#でポインタのポインタを使用してDLLを利用したいです。具体的には、intの配列の特定の要素のアドレスを配列に格納して使いたいです。
- C#からCで作成したDLLを使用する際に、引数がint**型となっている場合、C#でどのようにアドレスを配列に格納するのか教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
サンプルを作ってみました。 DLL として呼び出される関数(取り立てて意味は無いです) int のポインタの配列とデータ数でその合計を求めるもの ---------------------------------------------------------------- /* bcc32 -WD testDll.c */ __declspec(dllexport) int __stdcall ArraySum(int **array, int size){ int s=0; int i; for(i = 0; i < size;i++){ s+= *array[i]; } return s; } ---------------------------------------------------------------- // C#側 // コンパイル方法:csc /unsafe DllTest.cs using System; using System.Runtime.InteropServices; class TestOfunsafe { [DllImport("testDll.DLL", EntryPoint="ArraySum")] public static extern unsafe int ArraySum(int** array, int size); static unsafe void Main() { int[] a = { 1,2,3,4,5,6,7,8,9,10}; int*[] b = new int*[5]; int sum; fixed(int** pb = b){ //処理中マネージ変数を固定する int c=0; for(int i=0;i<10;i+=2){ fixed(int *pa = &a[i]){ pb[c++] = pa; //1個飛ばしにポインタをセット } } sum = ArraySum(pb, 5); } Console.WriteLine("合計: {0}", sum); } }
その他の回答 (1)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
C#でも * & -> などのポインタ演算子を使用することができます。 その場合コードブロックに unsafe 修飾子を付ける必要があります。 その中でだけ、先に挙げたポインタ演算子が使用できます。 また、 /unsafe コンパイルオプションを指定するか ビルドのプロパティから □アンセーフコードの許可 にチェックを付けてコンパイルする必要があります。 unsafe に関するヘルプを参照してみて下さい。 あと、バッファのやりとりをする場合 fixed キーワードが必要になる場合があります。
お礼
サンプルプログラムまでついた丁寧なアドバイス、ありがとうございます。 すごくよくわかりました。 fixedって、こうやって使うんですね。ガベージコレクティングの都合上仕方ないのかもしれませんが、ポインタの変数の数だけ、猛烈な入れ子のプログラムになってしまいそうです。仕方ありませんけど。 すごく助かりました。 何かの時には、またよろしくお願いします。