ポインタに対する加算
先回に続いて配列とポインタの関係をみていこう。先回の例と同様に、
int array[] = {10,20,30};
int *p = array;
としよう。このとき、ポインタ変数pには配列arrayの先頭要素のアドレスが入っている。ここで、「p+1」とすると、どうなるだろうか。
答えは、ポインタ変数に対して1を加算すると型のサイズ分だけアドレスの値が増えることになる。
pは、int型のアドレスが入るポインタ変数なので、この場合は4バイト後方に移動したアドレスを指す。
そして、「*(p+1)」は、次の要素array[1]の値を参照する。また、「*(p+2)」は、その次の要素array[2]の値を参照する。これらの関係を下の図で確認してみよう。
さらに、下のプログラムを実行して確認してみよう。
#include <stdio.h>
int main(void)
{
int array[] = {10,20,30};
int *p = array;
printf("*pの値は%dです。¥n",*p);
printf("*(p+1)の値は%dです。¥n",*(p+1));
printf("*(p+2)の値は%dです。¥n",*(p+2));
return 0;
}
実行結果
*pの値は10です。
*(p+1)の値は20です。
*(p+2)の値は30です。
ポインタのインクリメント
先の例と同様に、
int array[] = {10,20,30};
int *p = array;
としよう。今度は、
p++;
と、pをインクリメントしてみよう。すると、pに入っているアドレスは4バイト分増えて、array[0]を指していたのが、array[1]を指すようになる。さらにインクリメントすると、array[2]を指すようになる。
これらの関係を下の図で確認してみよう。
さらに、下のプログラムを実行して確認してみよう。
#include <stdio.h>
int main(void)
{
int array[] = {10,20,30};
int *p = array;
printf("*pの値は%dです。¥n",*p);
p++;
printf("*pの値は%dです。¥n",*p);
p++;
printf("*pの値は%dです。¥n",*p);
return 0;
}
実行結果
*pの値は10です。
*pの値は20です。
*pの値は30です。
コメント