それでは、lifo3.cを解説しながら、今回のタイトルである「配列とポインタの深い関係」を探っていきましょう。
5行目の
int n, data[100], *p;
は変数の宣言です。nはintの変数、dataは大きさ100のintの配列、そしてpはintへのポインタというわけです。dataはintがベースとなって派生した配列、pはintがベースとなって派生したポインタですね。このように、「配列とポインタはともに派生型である」わけです。
次に、9行目の
p = data;
ですが、「配列の名前はポインタとして扱われる」ので、結果としてpはdataを指し示します(ポイントします)。
ただ注意が必要で、pが指し示すのはdataの先頭の要素、つまりdata[0]です。data全体をポイントしていません(なぜならば、pは「intへのポインタ」だからです)。イメージとしては次の通りです。
さて、11行目の
*p = n;
ですが、pの指すオブジェクトにnを代入します。ここでpは配列dadaの要素を指し示しているので、*pはpの指すオブジェクト、つまりpの指す配列dataの要素にnを代入します。
次の12行目の
p++;
ですが、ここで++(インクリメント演算子)の、オペランドを1増加するも注意が必要です。それは「ポインタに対する演算は、配列の添字と同等に作用される」からなのです。
ではp++では何が行われるのでしょうか? それは「pの持つポインタを1つ後ろの要素に進める」です。
少し進みますが、17行目の
p--;
も、解釈としては「pの持つポインタを1つ前の要素に進める」となります。
応用として、Cプログラムで
*(data + 3);
と
data[3];
は、等価なのです。
Copyright © ITmedia, Inc. All Rights Reserved.