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

C#でポインタ表記を使って配列の要素にアクセスする方法

C#でポインタを使用するには、unsafe修飾子が必要です。また、ポインタを使って配列の要素にアクセスする際には、fixedキーワードを併用します。これは、配列とポインタのデータ型が同一ではないためです。例えば、int[]型はint*型とは同じではありません。

以下に、ポインタを使って配列の要素にアクセスする方法を示すサンプルプログラムを紹介します。

サンプルコード

using System;
namespace PointerDemo {
    class Example {
        public unsafe static void Main() {
            int[] array = {55, 23, 90, 76, 9, 57, 18, 89, 23, 5};
            int n = array.Length;
            fixed(int *ptr = array)
            for ( int i = 0; i < n; i++) {
                Console.WriteLine("array[{0}] = {1}", i, *(ptr + i));
            }
        }
    }
}

実行結果

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

array[0] = 55
array[1] = 23
array[2] = 90
array[3] = 76
array[4] = 9
array[5] = 57
array[6] = 18
array[7] = 89
array[8] = 23
array[9] = 5

プログラムの解説

ここから、上記プログラムの動作を詳しく見ていきましょう。

まず、配列にはint型の値が10個格納されています。fixedキーワードを使用することで、ポインタptrが配列の先頭を指すようになります。その後、forループを使って配列内のすべての値を表示しています。該当するコード部分は以下の通りです。

int[] array = {55, 23, 90, 76, 9, 57, 18, 89, 23, 5};
int n = array.Length;
fixed(int *ptr = array)
for ( int i = 0; i < n; i++) {
    Console.WriteLine("array[{0}] = {1}", i, *(ptr + i));
}

fixedステートメントが必要な理由は、ガベージコレクタによるメモリ移動を防ぐためです。C#の配列はマネージドオブジェクトであり、ガベージコレクタによってメモリ上の別の場所へ移動される可能性があります。fixedブロック内では配列が固定され、ポインタ経由での安全なアクセスが保証されます。なお、ポインタ演算*(ptr + i)は、配列のi番目の要素に相当し、通常の添字アクセスarray[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 型変数のアドレスを保持します。宣言時には、変数名の前に間接演算子 *(アスタリスク)を付けます。ポインタの初期化ポインタ変数を初期化するには、アドレス演