連載
» 2014年09月05日 11時00分 公開

【問題9】配列とポインタの深い関係完全マスター! 組み込みC言語プログラミング(10)(3/4 ページ)

[横田一弘 埼玉県立新座総合技術高等学校 教諭,MONOist]

配列とポインタ

 それでは、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へのポインタ」だからです)。イメージとしては次の通りです。

photo

 さて、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.