掌握sizeof

来源:互联网 发布:淘宝无线端怎么推广 编辑:程序博客网 时间:2024/06/05 06:18

来源:http://blog.vckbase.com/eyesonyhm/archive/2007/01/19/24091.aspx

首先需要说明的是sizeof是一个操作符,它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小,这是sizeof的核心所在,即操作数在内存占多大,sizeof就返回多少。但往往很多人都只是知道sizeof这些概念,而不知道如何使用它、在什么情况下使用它以及不能深刻理解sizeof的含义。所以我参考了一些文档,总结了一下,希望对大家有帮助:

一、sizeof的使用方法 
  1、用于数据类型

  sizeof使用形式:sizeof(type)

  数据类型必须用括号括住。如sizeof(int)。

  2、用于变量

  sizeof使用形式:sizeof(var_name)或 sizeof var_name

  变量名可以不用括号括住。如sizeof (var_name),sizeof var_name等都是正确形式,但建议用带括号的用法。

  sizeof操作符不能用于函数类型,不完全类型或位字段。在这里不完全类型指具有未知存储大小的数据类型,如void类型等。

    例:sizeof(printf); //错误,不能用于函数类型,printf是函数名称
             sizeof(void); //错误

    注意以下几种情况:
    (1)操作数为结构或类。(这里涉及到内存对齐方式的问题,网上的文档很多,可以参考:http://blog.csdn.net/topcool99/archive/2004/10/12/134092.aspx)
             第一、结构或者类中的静态成员不对结构或者类的大小产生影响,因为静态变量的存储位置与结构或者类的实例地址无关。
             第二、没有成员变量的结构或类的大小为1,因为必须保证结构或类的每一个实例在内存中都有唯一的地址。

    (2)void func(int a[10])
             {
                 cout<<sizeof(a); //这里输出4,由于它是一个指针,关于此问题可以参考《C专家编程》中数组与指针章节
             }

二、sizeof的使用场景
  1、分配存储空间
         这里最难的是分配多维数组存储空间,所以这里举了几个例子:
        方法一: int rows = 10;
                         int columns = 10;
                         int **array1 =(int **)  malloc(10* sizeof(*array1));
                         for(int i = 0; i < rows; i++)
                         array1[i] =(int *) malloc(columns * sizeof(**array1));
                         此方法比较常用
        方法二:int rows = 10;
                        int columns = 10;
                        int **array2 =(int **) malloc(rows * sizeof(int *));
                        array2[0] =(int *) malloc(rows * columns * sizeof(int));
                        for(int i = 1; i < rows; i++)
                        array2[i] = array2[0] + i * columns;
                        此方法的优点是存储空间连续


  2、sizeof的另一个的主要用途是计算数组中元素的个数。例如:

             int a[10];
             cout<<sizeof(a)/sizeof(int); //输出10

总结:sizeof操作符的操作数是什么类型,它就会返回该类型在存储空间中的大小,只是在使用上注意上面提到的几条就可以了。

0 0