本文参考http://www.cppblog.com/w57w57w57/archive/2011/08/09/152845.html又根据自己常被问及的问题和常犯的一些错误对其进行了一些补充。
sizeof的使用非常简单:求对象或者类型的大小。然后sizeof又非常复杂,它涉及到很多特殊情况。
(1) sizeof是操作符,不是函数。
MSDN:The sizeof keyword gives the amount of storage, in bytes, associate with a variable or a type(including aggregate types). This keyword returns a value of type size_t(typedef unsigned int size_t).
语法:sizeof(object);=> sizeof(1); sizeof(typename);=>sizeof(int); sizeof object;=>sizeof 1;(注意sizeof typename是错误的)
(2) sizeof不能求得void类型的长度。
你不能用sizeof(void);这样将产生:error C2070: illegal sizeof operand
比如如下代码:
void fun(){
}
int main(){
cout< return 0;
}//这个编译是不会通过的
char fun(){
return ‘a’;
}
int main()
{
cout< return 0;
}//引申一下,这个是测量返回值的长度,因此是1,而不是指针的长度4.结合第八点来看。
(3) sizeof能求得void类型的指针的长度。
目前基本上所有的编译器都把指针的大小看做是4byte。其实指针也是变量,只不过这个变量很特殊,它是存放其他变量的地址的变量。又由于目前32位计算机平台上的程序段的寻址范围是4GB,寻址的最小单元是Byte,4GB等于232byte。这么多得内存起地址如何编码,只需要用32个bit就行了,而32bit=32、8=4Byte,也就是说只要4Byte就能存储这些内存的地址了。因此对任何类型的指针变量进行sizeof运算其结果就是4.(一个疑问,指针类型用4Byte只存储了指针指向的地址,如何区分是何种类型的指针呢? )
(4) sizeof能求得静态分配的内存的数组的长度。
int a ;sizeof(a); 这样可求得长度是10*4=40.(引申问题:数组名和指针的区别。参看下篇 ),另外注意char ch[]=”abc”; sizeof(ch);结果为4,注意字符串数组末尾有’\0’,通常我们可以利用sizeof来计算数组中包含的元素个数。其做法是:int n=sizeof(a)/sizeof(a[0]);
要注意对函数的形参数组使用sizeof的情况。如:
void fun(int arr ){
int n = sizeof(arr);
}//n的值为4
这里的原因是在函数参数传递时,数组被转化成指针了。加入直接传递整个数组的话,那么必然涉及到数组元素的拷贝(实参到形参的拷贝),当数组非常大时,这会导致执行效率极低!而只传递数组的地址(即指针)那么只需要拷贝4Byte。