ポインタと配列


配列のデータはメモリ上に順序正しく格納されています。例えば
     int a[5] ;
という配列があったとき、a[0]のアドレスが4000番地にあったとすると、a[1]のアドレスは、4002番地、a[2]は4004番地、a[3]は4006番地、a[4]は4008番地となります。つまり、配列の基底アドレス(配列の先頭アドレス)がわかれば、この場合の配列はint型なので、要素数が1つ進むにつれて、アドレスは2つずつ進むわけです。(char型なら1ずつ進む)
   さて、ここで配列  int a[5] をポインタで参照するためには

        int *pa ;        (int型の変数を指すポインタ変数paを宣言)
       pa = a ;        (ポインタ変数paに配列の先頭アドレスを代入)

とします。配列名 a は、配列 a[5] の先頭アドレスを指し示すので(つまり、a = &a[0]   なので)、pa = a により配列の先頭アドレスがポインタ変数 pa に代入されます。したがって、*pa で a[0]の内容を参照することが出来ます。そこからは、pa++でポインタを1つずつ進めることによりa[1] 、a[2] 、a[3] 、a[4]の内容を次々と参照することが出来ます。

     (例 2.2)
               void main(void)
               {
                   static int a[ ] = {1,2,3,4,5};
                   int *pa ;
                   pa = a ;
                   while(*pa!=0)
                    {   
                       printf("%d    \n", *pa) ;
                       pa++ ;
                     }
                }

実行結果
            1 2 3 4 5

   先の例ではポインタpaの値をインクリメントして次々と進めて、配列 a[ ] の各データを順番に参照しましたが、pa を固定しておいてそこから何番目のデータというようにピンポイントでデータを参照することも可能です。例えば、ポインタpaを用いて配列 a[ ] の i 番目の要素を参照するには、次の二通りの表現があります。

            @       *( pa+i )

             A    pa [ i ]                

2つとも、paが持つアドレスに、 i を加えたアドレスの内容を取り出しています。

(例 2.3)

               void main ( void )
            {
                int i ;
                static int a = (1,2,3,4,5);
                int * pa ;
                pa = a ;
                for( i=0 ; i<5 ; i++)
                    printf("%d番目の要素は%d,%d",i+1,*(pa+i),pa[i]);
            }

実行結果
       1番目の要素は1,1
         2番目の要素は2,2
         3番目の要素は3,3
         4番目の要素は4,4
         5番目の要素は5,5


               


「基礎講座もくじへ」

「Q&Aもくじへ」

「つぎへ」