ページ 11

2次元配列へのポインタによるアドレス表示について

Posted: 2016年8月15日(月) 19:35
by SNF
C初心者です。
下記コードにおいてポインタ変数pを介して2次元配列の先頭要素アドレスを表示しています。
このうち pとp[0] が同じアドレスになるのは理解できますが *pと&p[0]も同様のアドレスを
表示しています。何故そうなるのかが分かりません。どのような考え方をすればよろしいのでしょうか?
ご教授お願いします。

-----ここから-----------------------------------

#include<stdio.h>

int main()
{

int x[5][5];
int i, j;
int(*p)[5];
p = x;
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++)
x[j] = (j+1)+(i*5);
}

printf("%p\n",p);
printf("%p\n", p[0]);
printf("%p\n", *p);
printf("%p\n", &p[0]);


for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++)
printf("%3d", p[j]);
printf("\n");
}

return 0;
}

Re: 2次元配列へのポインタによるアドレス表示について

Posted: 2016年8月15日(月) 19:48
by みけCAT
ソースコードを提示する際は、BBCodeを有効にした(無効にしない)状態でBBCodeのcodeタグで囲んでいただけると、見やすくてありがたいです。
SNF さんが書きました:このうち pとp[0] が同じアドレスになるのは理解できますが *pと&p[0]も同様のアドレスを
表示しています。何故そうなるのかが分かりません。どのような考え方をすればよろしいのでしょうか?
*pは*(p+0)すなわちp[0]と同じ意味です。
&p[0]は&*(p+0)すなわち&*pすなわちpと同じ意味です。
従って、「pとp[0] が同じアドレスになる」に帰着できます。
オフトピック
%pを用いてポインタの値を出力する際は、出力されるポインタをvoid*にキャストしてから渡すべきです。
さもないと、間違った型のデータをprintfに渡すことになり、未定義動作になります。

Re: 2次元配列へのポインタによるアドレス表示について

Posted: 2016年8月15日(月) 22:08
by SNF
みけCAT様

回答ありがとうございます。
又ソースコードを提示する際は今後codeタグで囲むようにします。