sizeof是C/C++中的关键字,它是一个运算符,其作用是取得一个对象(数据类型或者数据对象)的长度(即占用内存的大小,以byte为单位)。
在C++中,变量和自定义类型可以不用加(),内置类型要加。
需要注意的点包括:
1)它是运算符,不是函数;
2)sizeof不能求得void类型的长度;
下面两种情况都会编译出错,
sizeof (void );
void f(){};
sizeof (f());
3)sizeof求指针的长度:
sizeof(void *) = sizeof(int*) = sizeof(void*) = sizeof(double*)
在32位系统下,结果为4。
4)sizeof求得静态分配内存的数组的长度:
int a[10];
sizeof (a) = 10 * sizeof (int) = 40;
注意结果以字节为单位,所以不要忘了乘以4。
注意数组退化为指针(在传递数组时,为避免拷贝太多数据而导致效率太低,只传递数组的首地址)的情况:
void fun(int a[10])
{
int n = sizeof(a); //结果为4,常见的陷阱
}
注意上面提到的是是静态分配的数组,这是C/C++很特殊的一种内置类型。
对于动态分配的数组,是没办法用sizeof求其大小的,因为传递给sizeof的操作数是指针:
int* a = new int[10]; int n = sizeof (a); //结果为4
类似的:
char *ss = "0123";
sizeof(*ss)的结果是1。
其实应该说sizeof能求静态分配的数组是特殊的情况,深究下去就要涉及sizeof的实现了。
还有一种情况就是对于外部数组变量:
extern arrayA[];
extern arrayB[10];
cout<<sizeof(arrayA)<<endl; //编译出错!!
cout<<sizeof(arrayB)<<endl; //结果为40
主要是因为sizeof在编译阶段就完成对静态数组的求值,而C/C++以源程序文件(*.c,*.cpp)为单位进行编译,上面arrayA[]在哪个源文件定义、元素个数多少是要等链接时才知道的。
5)当表达式作为sizeof的操作数时,它返回表达式的计算结果的类型大小,但是它不对表达式求值!
int i = 0, j = 1;