私はこれらの2つのステートメントを持っています:
printf("%u",a+1);
と
printf("%u",(int *)a+1);
実際、この混乱に遭遇したとき、私はこのコードに取り組んでいました。
#include<stdio.h>
int main()
{
int a[2][2]={1,2,3,4};
int i,j;
int *p[] = { (int*)a, (int*)a+1, (int*)a+2 };
for(i=0; i<2; i++){
for(j=0; j<2; j++){
printf("%d %d %d %d",* (*(p+i)+j), *(*(j+p)+i), *(*(i+p)+j), *(*(p+j)+i));
}
}
return 0;
}
Output:
1 1 1 1
2 2 2 2
2 2 2 2
3 3 3 3
上記のプログラムの出力を理解するために、上記の2つのステートメントの違いを知っていれば、この出力を作成している違いを解決できることがわかりました。
私の現在の理解:
(a+1)
配列の2番目の要素のアドレスを教えてくれます。この場合、2次元配列は、それぞれ2つの要素を持つ2つの1次元配列として視覚化できます。だから(a+1)
私にのアドレスを教えてくれますa[1][0]
が、なぜ(int *)a+1
私にのアドレスを教えてくれるのa[0][1]
ですか?
プログラムの違いと出力について説明してください。
ありがとう。