「C言語/配列とポインタ」の版間の差分

削除された内容 追加された内容
→‎配列ポインタに対する加算: 二次元配列の場合を追記
145 行
printf("アドレスpa+1は %p \n", pa+1);
 
printf("(&a[0][0]) +1の場合でも %p \n", (&a[0][0]) +1 );
 
}
159 行
アドレスpaは 000000000022FE20
アドレスpa+1は 000000000022FE24
(&a[0][0]) +1の場合でも 000000000022FE24
</pre>
 
173 行
これは<code>a[0][0]</code>および<code>a[0][1]</code>といった、つまり<code>a[0][なにか]</code>グループの先頭配列という意味です。
なので、結果的にこの例の場合なら<code>a[0][0]</code>のアドレスに一致します。
 
その証拠として、<code>a[1][なにか]</code>グループ(二次元目が0でなく1です)の先頭配列のアドレスも同様の方法で代入できます。
 
<syntaxhighlight lang=c>
#include <stdio.h>
 
int main(void) {
int a[3][2] = {
{2, 3},
{5, 7},
{11,13}
};
 
int k=1; // 1に変更
for (int i = 0; i < 2; i++){
printf("%d ", a[k][i]);
}
printf("\n");
 
int *pa = a[1]; // a[1][なにか]グループに変更
 
printf("アドレスpaは %p \n", pa);
printf("アドレス&a[1][0]は %p \n", &a[1][0]);
printf("アドレス&a[1][1]は %p \n", &a[1][1]);
printf("\n");
printf("アドレスpaは %p \n", pa);
printf("アドレスpa+1は %p \n", pa+1);
 
printf("(&a[1][0]) +1の場合でも %p \n", (&a[1][0]) +1 );
 
}
</syntaxhighlight>
 
実行結果
<pre>
5 7
アドレスpaは 000000000022FE28
アドレス&a[1][0]は 000000000022FE28
アドレス&a[1][1]は 000000000022FE2C
 
アドレスpaは 000000000022FE28
アドレスpa+1は 000000000022FE2C
(&a[1][0]) +1の場合でも 000000000022FE2C
</pre>
 
 
三次元以上でも同様の処理が可能ですが、似た説明の繰り返しになるので、本ページでは説明を省略します。(おそらく本wikibooks『C言語』教科書全体でも説明が省略されると思います。)