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;
}
2次元配列へのポインタによるアドレス表示について
Re: 2次元配列へのポインタによるアドレス表示について
ソースコードを提示する際は、BBCodeを有効にした(無効にしない)状態でBBCodeのcodeタグで囲んでいただけると、見やすくてありがたいです。
&p[0]は&*(p+0)すなわち&*pすなわちpと同じ意味です。
従って、「pとp[0] が同じアドレスになる」に帰着できます。
*pは*(p+0)すなわちp[0]と同じ意味です。SNF さんが書きました:このうち pとp[0] が同じアドレスになるのは理解できますが *pと&p[0]も同様のアドレスを
表示しています。何故そうなるのかが分かりません。どのような考え方をすればよろしいのでしょうか?
&p[0]は&*(p+0)すなわち&*pすなわちpと同じ意味です。
従って、「pとp[0] が同じアドレスになる」に帰着できます。
オフトピック
%pを用いてポインタの値を出力する際は、出力されるポインタをvoid*にキャストしてから渡すべきです。
さもないと、間違った型のデータをprintfに渡すことになり、未定義動作になります。
さもないと、間違った型のデータをprintfに渡すことになり、未定義動作になります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 2次元配列へのポインタによるアドレス表示について
みけCAT様
回答ありがとうございます。
又ソースコードを提示する際は今後codeタグで囲むようにします。
回答ありがとうございます。
又ソースコードを提示する際は今後codeタグで囲むようにします。