Ank*_*pal 0 c multidimensional-array
#include<stdio.h>
int main()
{
int a[3][4]={2,5,3,2,6,9,0,1,8,10,11,12};
printf("%u, %u, %u",a,a+1,&a+1);
return 0;
getch();
}
Run Code Online (Sandbox Code Playgroud)
此代码的输出是:
2293472, 2293488, 2293520
Run Code Online (Sandbox Code Playgroud)
有人能解释我怎么得到这个?
这是每个发生的事情a,a+1并且&a+1:
a:由于a是数组,因此使用a它会衰减成指向此数组的第一个元素的指针,该数组是4个整数的数组(a因此,类型为is int (*)[4]).这是您要打印的地址:数组a的第一个元素的地址(也是第二级数组中第一个元素的地址)a+1:这与拾取a并将其移动到下一个对象(即sizeof(int)*4字节数)相同,因为每个元素a都是4个整数的数组.因此,这将打印第二个元素的地址a.&a+1:这是少数例外情况之一,其中不应用数组到指针的确定规则.当数组是引用operator(&)的操作数sizeof,操作数或字符串文字初始值设定项时,数组不会衰减为指针.因此,&a它不是指向4个整数数组的指针,而不是指向它的数组的地址,按照惯例,它是第一个元素的地址a.地址与a(是的,a并且&a具有相同的地址)相同,但区别在于它&a具有指向int的数组[3] [4]的类型指针,也就是说int (*)[3][4],意味着下一个对象(结果&a+1)是sizeof(int)*3*4字节远,这就是你得到的地址.旁注:您应该使用%p打印指针值而不是依赖于指针与unsigned int的大小相同的事实.这是对的:
printf("%p, %p, %p", (void *) a, (void *) (a+1), (void *) (&a+1));
Run Code Online (Sandbox Code Playgroud)
看看你得到的输出,我可以看到sizeof(int)你的系统中有4个.通过一些小数学,你可以看到确实a+1是a+16(2293472 + 4*4 = 2293488),并且&a+1距离是4*3*4个字节; 2293472 + 4*3*4 = 2293520