配列のポインタ

9, 8, 7, 6, 5, 4, 3, 2, 1, 0,

0-A, 1-B, 2-C, 3-D, 4-E,

ポインタを使って配列にアクセスします。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. Pointer は一歩間違えれば、他の領域を破壊しかねません。
    配列の場合は特にその危険性が高く、unsafe を設定して覚悟の上で使います。
    配列に Pointer を使うときは、stackalloc で配列を静的に確保したり、fixed でアドレス固定する必要があります。
    詳細は ++C++; // 未確認飛行 C を参照して下さい。
    コマンドラインからコンパイルするときは /unsafe オプションを設定して下さい。
    csc /unsafe stackalloc.cs
  2. stackalloc で配列を静的確保するサンプルプログラムです。
    stackalloc int[10]; で10個の int 領域を確保します。
    pt=x+9; で配列の最後のアドレスを設定して pt-- で逆方向に *pt で値を参照します。
    /****************************************************/
    /*★ stackalloc で配列のポインタを使う    前田 稔 ★*/
    /****************************************************/
    using System;
    
    class UnsafeTest
    {
      static void Main()
      {
        unsafe
        {
          int* x = stackalloc int[10]; // 配列をスタック上に確保
          int* pt;
    
          // 配列 x に 0~9 を代入
          for(int i=0; i<10; ++i)   x[i] = i;
    
          // 配列を逆に出力
          Console.Write('\n');
          pt = x+9;
          for(int i=0; i<10; ++i,pt--)  Console.Write("{0}, ", *pt);
          Console.Write('\n');
        }
      }
    }
    
  3. 実行の結果です。
    9, 8, 7, 6, 5, 4, 3, 2, 1, 0,
    
  4. fixed でアドレス固定するサンプルプログラムです。
    fixed(char* pt= x) で pt に配列 x のアドレスを設定します。
    *(pt+i) で配列 x の値を参照します。
    /*******************************************************/
    /*★ fixed で領域を固定してポインタを使う    前田 稔 ★*/
    /*******************************************************/
    using System;
    
    class UnsafeTest
    {
      static void Main()
      {
        unsafe
        {
          char[] x = new char[5];
          for(int i=0; i<5; ++i)    x[i] = (char)('A'+i);
    
          fixed(char* pt= x)
          {
            // 配列 x を表示
            for(int i=0; i<5; i++)  Console.Write("{0}-{1}, ", i,*(pt+i));
          }
        }
      }
    }
    
  5. fixed(char* pt= x) で宣言された pt は固定領域となり、値の変更は出来ません。
  6. 実行の結果です。
    0-A, 1-B, 2-C, 3-D, 4-E,
    

超初心者のプログラム入門(C# Frame Work)