今回は、密接な関係にある「ポインタと配列」について学んでいこう。
ポインタと配列
配列名は、その配列の先頭要素へのポインタと解釈される。
aが配列であれば、式aの評価で得られるのは、&a[0]である。
int a[5];
int *p = a;
ここでは、配列aとポインタpが宣言されている。
ポインタpに与えられた初期化子aは&a[0]のことであるので、ポインタpは、配列の先頭要素a[0]を指すように初期化される。
ポインタpが配列中の要素eを指すとき、
p + i は、要素eのi個だけ後方の要素を指すポインタとなり、
p – i は、要素eのi個だけ前方の要素を指すポインタとなる。
要素へのポインタp + iは、&a[i]のことである
このことをプログラムを作って確認してみよう。
「配列の要素のアドレス(要素へのポインタ)を表示するプログラム」である。
なお、本プログラムは、Windows 11 Home(23H2)上で、 Visual Studio Code(1.90.0)を使用して作成し、gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0でコンパイルしている。
配列の要素のアドレス(要素へのポインタ)を表示するプログラム
//配列の要素のアドレス(要素へのポインタ)を表示するプログラム
#include <stdio.h>
int main(void)
{
int a[5] = {1,2,3,4,5};
int *p = a;
for (int i = 0; i < 5; i++)
printf("&a[%d] = %p p + %d = %p\n",i ,&a[i],i ,p + i);
return 0;
}
実行結果
&a[0] = 0x7ffcb19145a0 p + 0 = 0x7ffcb19145a0
&a[1] = 0x7ffcb19145a4 p + 1 = 0x7ffcb19145a4
&a[2] = 0x7ffcb19145a8 p + 2 = 0x7ffcb19145a8
&a[3] = 0x7ffcb19145ac p + 3 = 0x7ffcb19145ac
&a[4] = 0x7ffcb19145b0 p + 4 = 0x7ffcb19145b0
for文では、各要素へのポインタである、式&a[i]の値と、式p + iの値を表示している。
実行結果から、これら二つの値が同じであることが確認できる。
(参考) 新・明解C言語 入門編 第2版 柴田 望洋 (著)SBクリエイティブ
コメント