int main()
{
int a[3][4] = { 0 };
由于是一个二维数组,其组成为
printf("%d\n", sizeof(a));
sizeof(a)就是sizeof(数组名),计算的是整个数组的大小,为3*4*4=48
printf("%d\n", sizeof(a[0][0]));
sizeof(a[0][0])指的是
又因为该数组是整型数组,一个元素是4个字节,所以答案是4.
printf("%d\n", sizeof(a[0]));
sizeof(a[0])的内容大致如下
相当于一个sizeof(数组名),所以答案为4*4=16
printf("%d\n", sizeof(a[0] + 1));
由于sizeof(a[0]+1)不是单独一个sizeof(a[0]),所以sizeof(a[0]+1)中的a[0]本质上是a[0][0]的地址,所以a[0][0]+1为下面的地址,所以答案为4/8.
printf("%d\n", sizeof(*(a[0] + 1)));
由于不是单独一个a[0]放在sizeof()里面,所以sizeof(*a[0])指的是第一行数组的第一个元素,所以sizeof(*a[0]+1)是指第一行第二个元素,所以答案为4.
printf("%d\n", sizeof(a + 1));
这里的sizeof(a+1)不是单独一个sizeof(a),所以这里的sizeof(a+1)指的是这个二维数组的第二个元素,也就是二维数组的第二行的地址,由于是地址,所以答案应为4/8
printf("%d\n", sizeof(*(a + 1)));
我们可知,a+1指的是第二行的地址,但是由于有解引用符号*,所以要对第二行全体元素取出,所以是4*4=16.
printf("%d\n", sizeof(&a[0] + 1));
&a[0]是第一行的地址,所以&a[0]+1是第二行的地址,由于是地址,所以大小为4/8.
printf("%d\n", sizeof(*(&a[0] + 1)));
&a[0]+1就是第二行的地址,又因为解引用了,所以取得是第二行全体元素一共是4*4=16
printf("%d\n", sizeof(*a));
因为不是单独一个a放在sizeof()里面。所以是取得第一个元素,又因为这个是个二维数组,这里面的第一个元素就是第一行,所有为4*4=16
return 0;
}