我有这两个陈述:
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
为了理解上述程序的输出,我知道如果我知道上述两个语句之间的区别,那么产生这个输出的区别就可以解决。
我目前的理解:
(a+1)
会给我数组第二个元素的地址。在这种情况下,一个二维数组可以可视化为 2 个一维数组,每个数组有 2 个元素。所以(a+1)
会给我地址a[1][0]
,但是为什么(int *)a+1
给我地址a[0][1]
呢?
请解释程序的区别和输出。
谢谢。