来源: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操作符的操作数是什么类型,它就会返回该类型在存储空间中的大小,只是在使用上注意上面提到的几条就可以了。