ポインタの使い道(その1) - 配列の要素を指す

C 言語のポインタは, いくつかの典型的な使用パターンがあります. そのうちのひとつ, 「配列の要素を指す」を説明しましょう.

配列 v の 0 番目の要素を参照するには, v[0] としますね. ここで, ポインタ変数 p が あらかじめ v を指していれば, *p も同じ要素を参照します.

ここで, p=p+1 (あるいはもっと簡潔に p++)を行なうと, 今度は *p は v[1] のことになります.

つまり, ポインタは, 本来なら (配列名, 添字) の組で指定される配列要素を, たった一つの変数で指すことができることになります. さらに, ポインタの ++ は, 添字の ++ と対応するわけです. 添字を使ったプログラムと, ポインタを使ったプログラムを並べてみると:

i = 0;          p = v;
v[i]=..         *p=..        --- v[0] のこと
i ++;           p ++;
v[i]=..         *p=..        --- v[1] のこと
i ++;           p ++;
v[i]=..         *p=..        --- v[2] のこと
...

普通にプログラムを書いている分には, (配列名, 添字) の組を 使っても, ポインタを使っても同じことができます. みなさんは, 配列参照についてはポインタを使わなくて良いと 寺田は考えています. (が, ここでは練習のために紹介しています)
ただ, 記述の簡潔さという点から, ポインタによる記述を 好む人もいます. (昔はポインタで記述した方が実行速度が早かったことも原因の一つ)


下のプログラムは, 整数配列の要素の和を求めるものです.
  int v[10];
  int sum = 0;
  int i;

  for(i=0; i<10; i++){
    sum += v[i];
  }
これを, ポインタを使って書くとこうなります(青いところが相違点):
  int v[10];
  int sum = 0;
  int *p;

  for(p=v; p<v+10; p++){
    sum += *p;
  }
対応関係に納得がいきましたか? for 文の繰返し条件である 「p<v+10」とは, 「p が v[10] より若い番地を指している」という意味で, 添字を使った時の 「i<10」に対応しています.
prev index next