对于二维数组
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
本文详细解析了在C语言中使用sizeof运算符处理二维数组时的不同情况,包括计算数组整体大小、一维数组大小、单个元素大小以及指针偏移后的大小。涉及到的知识点包括数组地址、指针加法和解引用操作。
1371

被折叠的 条评论
为什么被折叠?



