1.int a[3][4] = {0};
----------------------------------------
printf("%d\n",sizeof(a));
12元素,12*4=48字节;
-------------------------------------
printf("%d\n",sizeof(a[0][0]));
一个元素,4字节;
------------------------------------
printf("%d\n",sizeof(a[0]));
a[0]是第一行数组的数组名,第一行的大小,4元素,4*4=16字节;
---------------------------------------------
printf("%d\n",sizeof(a[0]+1));
第1行的第2个元素地址,4/8字节;
----------------------------------------------
printf("%d\n",sizeof(*(a[0]+1)));
表示第1行的第2个元素,整形4字节;
------------------------------------------------
printf("%d\n",sizeof(a+1));
跳过一行,指向第二行,指向第二行首个元素地址,是4/8;
---------------------------------------------
printf("%d\n",sizeof(*(a+1)));
等价于a[1],即第二行数组名,放在sizeof里面求第二行数组大小,16字节;
第二行地址,数组指针解引用,计算第二行数组大小;
-----------------------------------------------------------
printf("%d\n",sizeof(&a[0]+1));
第一行地址加上1表示第2行地址,4/8字节;
--------------------------------------------------------
printf("%d\n",sizeof(*(&a[0]+1)));
第二行大小,4元素,16字节;
----------------------------------------------------------
printf("%d\n",sizeof(*a));
a是第1行的地址,解引用是第一行的大小,16字节;
*a--->*(a+0)-->a[0]也可以理解;
------------------------------------------------------------
printf("%d\n",sizeof(a[3]));
越界的,大小16字节,和a[0],a[1]的类型是相同的,不会访问内存,只关注类型;
类如:
b+2=6short类型赋值给a的int类型,结果就是类型,大小是4;
a并没有被复赋值,还是2,因为sizeof里面的内容不会真正的执行,编译的时候就已经确定了;