对于二维数组
int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
1.
printf("%d\n", sizeof(a));
- 数组名
a
为数组首元素地址,这里为二维数组,即为第一行的地址 - 这里单独放在
sizeof
内部,为整个二维数组的地址,结果为48
2.
printf("%d\n", sizeof(a[0]));
a[0]
为数组第一个元素,即为第一行的一维数组的数组名,为其首元素地址- 这里单独放在
sizeof
内部,为此整个一维数组的地址,结果为16
3.
printf("%d\n", sizeof(a[0]+1));
a[0]
为数组第一个元素,即为第一行的一维数组的数组名,为其首元素地址+1
指向其第二个元素,即拿到的是第一行第二个元素的地址,结果为4/8
4.
printf("%d\n", sizeof(*(a[0] + 1)));
a[0]
为数组第一个元素,即为第一行的一维数组的数组名,为其首元素地址+1
指向其第二个元素,即拿到的是第一行第二个元素的地址- 再
*
解引用拿到该元素,相当于a[0][1]
,结果为4
5.
printf("%d\n", sizeof(a+1));
- 数组名
a
为数组首元素地址,这里为二维数组,即为其第一行的地址 +1
指向二维数组第二个元素,即为第二行的地址,为地址,结果为4/8
6.
printf("%d\n", sizeof(*(a + 1)));
- 数组名
a
为数组首元素地址,这里为二维数组,即为其第一行的地址 +1
指向二维数组第二个元素,即为第二行的地址,- 这里可用类型来理解,类型为
int(*)[4]
,对其*
解引用拿到整个数组,结果为16
- 也可理解为
a[1]
,第二行的数组名,单独放在sizeof
内部,代表整个数组,结果为16
7.
printf("%d\n", sizeof(&a[0]+1));
a[0]
为数组第一个元素,即为第一行的一维数组的数组名&a[0]
对第一行的数组名取地址,拿到整个一维数组的地址+1
跳过整个一维数组,指向第二行,与a+1
效果一样,为地址,结果为4/8
8.
printf("%d\n", sizeof(*(&a[0] + 1)));
*(&a[0] + 1)
与*(a + 1)
同理,结果为16
9.
printf("%d\n", sizeof(*a));
- 数组名
a
是其首元素地址,是一个一维数组,解引用拿到这个一维数组 *a
同*(a+0)
一样,代表a[0]
,所以结果为16
10.
printf("%d\n", sizeof(a[3]));
sizeof
内部表达式不运算,这里并不会进行访问,即不存在越界- 根据类型
a[3]
为一个有四个元素的一维数组,结果为16