C言語の基礎(配列とポインタ 2)

スポンサーリンク
C言語

ポインタに対する加算

先回に続いて配列とポインタの関係をみていこう。先回の例と同様に、

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です。

コメント

タイトルとURLをコピーしました