1.首先,要知道数组名表示数组首元素的地址
但是有2种情况下是特殊的:
(1)sizeof(数组名)表示的是整个数组的大小;
(2)&数组名表示整个数组的地址;
int a[] = { 1,2,3,4 };
(1)printf("%d\n", sizeof(a));
符合2种特殊情况,所以求的是数组的大小,所以是16,单位字节
(2)printf("%d\n", sizeof(a + 0));
本来是首元素的地址,加上0还是首元素的地址,地址大小4或8个字节;
(4或8由环境决定,x86是32位,4字节,x64是64位,8字节)
(3)printf("%d\n", sizeof(*a));
表示第一个元素的大小,因为是整形,所以大小4字节;
(4)printf("%d\n", sizeof(a + 1));
a+1指向第二个元素的地址,所以是4或8;
(5)printf("%d\n", sizeof(a[1]));
第二个元素的大小,所以是4字节;
(6)printf("%d\n", sizeof(&a));
整个数组的地址,地址就是4或8
;
(7)printf("%d\n", sizeof(*&a));
&a的类型是int(*)[4],解引用后就是相当于sizeof(a)即16字节;
(8)printf("%d\n", sizeof(&a + 1));
整个数组地址,加1跳过了整个数组,但是仍然是数组,是地址就是4或8;
(9)printf("%d\n", sizeof(&a[0]));
首元素地址,所以4或8;
(10)printf("%d\n", sizeof(&a[0] + 1));
首元素地址加上1,跳过一个元素,但是求的是第二个元素的地址,是地址就是4或8;
2.