话不多说,直入主题,先看代码:
int main() {
int arr[3][4] = { 0 };
printf("%d\n",sizeof(arr) );
printf("%d\n", sizeof(arr[0][0]));
printf("%d\n", sizeof(arr[0])); //a[0]是第一行数组数组名 数组名在sizeof里面意义代表整个数组 4×4=16
printf("%d\n", sizeof(arr[0]+1)); //第一行数组的首地址 +1后为第一行第二个元素地址
printf("%d\n", sizeof(*(arr[0] + 1)));
printf("%d\n", sizeof((arr+1))); //arr是二维数组的数组名 没有sizeof(arr)也没有&arr 所以arr是首元素地址而二维数组的首元素是第一行,arr就是第一行的地址,所以+1后是第二行的首地址
printf("%d\n", sizeof(*(arr+1)));
printf("%d\n", sizeof(&arr[0]+1)); //第一行数组名取地址再加1 第二行地址
printf("%d\n", sizeof(*(&arr[0] + 1)));
printf("%d\n", sizeof(*arr));// 16
printf("%d\n", sizeof(arr[3])); // sizeof里面的表达式不进行运算 不会访问第四行 所以arr[3]和arr[1]一样 16
}
你能正确的把上述代码输出内容全部计算正确吗?
我们先看输出结果:
然后我们来依次解释每一个内容:
1.sizeof(arr)
arr为数组名,数组名单独放在sizeof()内部代表整个数组,所以sizeof()计算整个数组的大小,故为48个字节
2.sizeof(arr[0][0])
sizeof()里面为二维数组的首元素,故为4个字节
3.sizeof(arr[0])
4.sizeof(arr[0]+1)
5. sizeof(*(arr[0] + 1))
第二个元素解引用后的大小,故为4个字节
6.sizeof((arr+1))
7.sizeof(*(arr+1))
8.sizeof(&arr[0]+1)
9.sizeof(*(&arr[0] + 1))
10.sizeof(*arr)
11.sizeof(arr[3])
这个比较易错,这个并不是溢出的错误,sizeof()中并不对里面的表达式进行计算,所以arr[3]和arr[0]是一样的,故结果是16
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo8.com 版权所有 湘ICP备2023022238号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务