黑马程序员技术交流社区

标题: sizeof第三弹 [打印本页]

作者: liu1170486003    时间: 2015-1-13 14:32
标题: sizeof第三弹
附上之前两个例子:
sizeof第二发

sizeof第一发

彻底理解sizeof的一个例子:

  1. #include <stdio.h>

  2. int main(int argc, char *argv[])
  3. {
  4.         double* a[2][3];
  5.         printf("%d\n", sizeof(a));
  6.         printf("%d\n", sizeof(*a));
  7.         printf("%d\n", sizeof(**a));
  8.         printf("%d\n", sizeof(***a));
  9.        
  10.        
  11.         double* (*b)[2][3];
  12.         printf("%d\n", sizeof(b));
  13.         printf("%d\n", sizeof(*b));
  14.         printf("%d\n", sizeof(**b));
  15.         printf("%d\n", sizeof(***b));
  16.         printf("%d\n", sizeof(****b));

  17.         return 0;
  18. }
复制代码

输出:
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