• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C#でポインタのポインタを作りたい)

C#でポインタのポインタを作りたい

このQ&Aのポイント
  • C#でポインタのポインタを作成する方法について教えてください。
  • C#でポインタのポインタを使用してDLLを利用したいです。具体的には、intの配列の特定の要素のアドレスを配列に格納して使いたいです。
  • C#からCで作成したDLLを使用する際に、引数がint**型となっている場合、C#でどのようにアドレスを配列に格納するのか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.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); } }

pokuda
質問者

お礼

サンプルプログラムまでついた丁寧なアドバイス、ありがとうございます。 すごくよくわかりました。 fixedって、こうやって使うんですね。ガベージコレクティングの都合上仕方ないのかもしれませんが、ポインタの変数の数だけ、猛烈な入れ子のプログラムになってしまいそうです。仕方ありませんけど。 すごく助かりました。 何かの時には、またよろしくお願いします。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

C#でも * & -> などのポインタ演算子を使用することができます。 その場合コードブロックに unsafe 修飾子を付ける必要があります。 その中でだけ、先に挙げたポインタ演算子が使用できます。 また、 /unsafe コンパイルオプションを指定するか ビルドのプロパティから □アンセーフコードの許可 にチェックを付けてコンパイルする必要があります。 unsafe に関するヘルプを参照してみて下さい。 あと、バッファのやりとりをする場合 fixed キーワードが必要になる場合があります。

関連するQ&A

専門家に質問してみよう