黑马程序员技术交流社区
标题:
sizeof第三弹
[打印本页]
作者:
liu1170486003
时间:
2015-1-13 14:32
标题:
sizeof第三弹
附上之前两个例子:
sizeof第二发
sizeof第一发
彻底理解sizeof的一个例子:
#include <stdio.h>
int main(int argc, char *argv[])
{
double* a[2][3];
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(*a));
printf("%d\n", sizeof(**a));
printf("%d\n", sizeof(***a));
double* (*b)[2][3];
printf("%d\n", sizeof(b));
printf("%d\n", sizeof(*b));
printf("%d\n", sizeof(**b));
printf("%d\n", sizeof(***b));
printf("%d\n", sizeof(****b));
return 0;
}
复制代码
输出:
24
12
4
8
4
24
12
4
8
作者:
从今以后
时间:
2015-1-13 19:47
这酸爽。。
作者:
liu1170486003
时间:
2015-1-15 00:15
有了右左法则,这个就好分析多了
[右左法则飞机票:http://blog.csdn.net/cattycat/article/details/5660353]
首先分析double *a[2][3];:
向右,[2][3],表示a是一个维度为2,3的二维数组;
向左,double *,该数组存放double *数据,也就是double类型的指针。
由于我是用的32为的C编译器,所以一个指针所占字节数为4
所以
sizeof(a)表示数组所占字节数,返回2*3*4=24
sizeof(*a)表示二维数组中的第一维所占字节数,即每一行所占字节数,返回3*4=12
sizeof(**a)表示二维数组中第一个元素所占字节数,即一个double类型指针所占字节,返回4
sizeof(***a)表示二维数组中第一个元素中的指针所指的double型数据所占字节数,返回8
然后分析double *(*b)[2][3];
向右,为括号,转向;
向左,*,表示b是一个指针;
跳出括号;
向右,[2][3],表示上一步的指针指向一个维度为[2][3]的二维数组;
向左,double *,表示上一步的数组中存放double *类型的数据,即double型指针
所以
sizeof(b)返回一个指针所占字节数,为4
sizeof(*b)表示数组所占字节数,由于数组中存放double型指针,所以返回值为2*3*4=24
sizeof(**b)表示二维数组中第一行所占字节数,即3*4=12
sizeof(***b)表示二维数组中第一个元素所占字节数,即一个double型指针的大小,返回4
sizeof(****b)表示double型指针所指内容,即一个double型数据所占字节数,返回8
作者:
zyp115
时间:
2015-1-15 00:48
这是在哪找到的,很有用诶,论坛翻出来的?
作者:
liu1170486003
时间:
2015-1-15 00:55
zyp115 发表于 2015-1-15 00:48
这是在哪找到的,很有用诶,论坛翻出来的?
自己写的,这些我记得当初学C语言的时候老师出过类似的题,当时没好好学,而且现在也忘了。然后又去网上找了右左法则,右左法则链接看第二弹,飞机票在一楼。
作者:
冰川
时间:
2015-1-15 15:04
无法直视。。。
作者:
菜鸟八哥
时间:
2015-1-15 17:48
左右法则?
作者:
liu1170486003
时间:
2015-1-16 00:18
菜鸟八哥 发表于 2015-1-15 17:48
左右法则?
恩,网上的汉语翻译叫左右法则,可是英文里却写着右左,而且再使用的时候也是先右后左,所以我就按照英文翻译的来了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2