C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#でポインターを使用して配列要素にアクセスするにはどうすればよいですか?

配列とポインターは同じ型ではない

C#では、配列名と「配列と同じデータ型へのポインター」は、同じ変数型として扱われません。たとえば、int *pint[] p は同一の型ではありません。

ポインター変数 p はメモリ上に固定されていないため、インクリメント(アドレスを1つ進める)することが可能です。しかし、配列のアドレスはガベージコレクタによって移動される可能性があるため固定されており、直接インクリメントすることはできません。そこで、C#で配列をポインター経由で操作する場合は、fixed ステートメントを使用して、配列のアドレスを一時的に固定します。

コード例

以下は、fixed ステートメントを使って配列の先頭アドレスをポインターに取得し、各要素のアドレスと値を出力するサンプルです。

using System;

namespace UnsafeCodeApplication {
    class TestPointer {
        public unsafe static void Main() {
            int[] list = {5, 25};
            fixed(int *ptr = list)

            /* 配列のアドレスをポインターに格納 */
            for ( int i = 0; i < 2; i++) {
                Console.WriteLine("Address of list[{0}]={1}",i,(int)(ptr + i));
                Console.WriteLine("Value of list[{0}]={1}", i, *(ptr + i));
            }
            Console.ReadKey();
        }
    }
}

なお、このコードのようにポインターを使用する「アンセーフコード」をコンパイルするには、コンパイラオプションに /unsafe を指定する必要があります。

実行結果

上記プログラムを実行すると、次のような出力が得られます。

Address of list[0] = 31627168
Value of list[0] = 5
Address of list[1] = 31627172
Value of list[1] = 25

出力を見ると、list[1] のアドレスは list[0] よりも4バイト大きくなっています。これは int 型が4バイトであるためで、ポインターの算術演算(ptr + i)によって、型のサイズに応じた分だけアドレスが自動的に進むことを示しています。

  1. Androidで配列の要素を並べ替える方法をわかりやすく解説

    この記事では、Androidアプリで配列の要素を並べ替え(ソート)する方法を、実際に動くサンプルコードとともに解説します。数値が入った配列を昇順に並べ替え、その結果を画面に表示するまでの一連の手順を確認していきましょう。 手順1:新規プロジェクトを作成する まず、Android Studioで新しいプロジェクトを作成します。メニューから「File」→「New Project」を選択し、必要な項目を入力してプロジェクトを作成してください。 手順2:レイアウトファイルにコードを追加する 次に、res/layout/activity_main.xml に以下のコードを記述します。 <?x

  2. 【初心者向け】C言語のポインタを使って配列要素の合計を計算する方法

    ポインタとは?ポインタ(Pointer)とは、他の変数のアドレス(メモリ上の場所)を格納するための変数のことです。例えば、次のような変数宣言を見てみましょう。int qty = 179;この場合、変数 qty には値 179 が格納されています。ポインタは、この qty が配置されているメモリ上のアドレスを保持することができます。ポインタの宣言ポインタを宣言する構文は以下の通りです。int *p;ここで p はポインタ変数であり、他の int 型変数のアドレスを保持します。宣言時には、変数名の前に間接演算子 *(アスタリスク)を付けます。ポインタの初期化ポインタ変数を初期化するには、アドレス演