sizeof运算符返回类型或数据对象的长度(单位为字节)。
一、数组的sizeof(指出整个数组的长度,即括号里的值)
注意:1、如果将sizeof用于数组元素,则得到的是元素的长度。
2、如果将sizeof用于数组名,得到的将是整个数组中的字节数。
3、当字符数组表示字符串时,其sizeof值将’/0’计算进去。
4、当数组为形参时,其sizeof值相当于指针的sizeof值。
例子1:
char a[20];
char b[]={"abc"};
char c[]={1,2,3};
cout<<sizeof(a)<<endl; //1、数组,值为20
cout<<strlen(a)<<endl; //2、值为11(这个值在不同的编译器值是不同的)
cout<<sizeof(b)<<endl; //3、字符串数组,值为4
cout<<strlen(b)<<endl; //4、值为3
cout<<sizeof(c)<<endl; //5、数组,值为3,注意因为不是字符串数组,所以'\0'没算进去
cout<<sizeof(b[0])<<endl; //6、数组元素,值为1
cout<<sizeof(c[1])<<endl; //7、数组元素,值为1
cout<<c[2]<<endl; //8、值为小爱心形状
sizeof()的用法和strlen()的区别:sizeof运算符指出整个数组的长度,但是strlen()函数返回的是存储在数组中的字符串的长度,而不是数组本身的长度。另外,strlen()只计算可见的字符,而不把空字符计算在内。(具体例子见上面)
函数strlen()从数组的第一个元素开始计算字符数,直到遇到空字符。对于未被初始化的数据,第一个空字符的出现位置是随机的。
void func(char a[3])
{
int c = sizeof(a); //c = 4,因为这里a不在是数组类型,而是指针,相当于char *a。
}
对应上面注意事项的第四点。
二、指针的sizeof
指针是用来记录另一个对象的地址,所以指针的内存大小当然就等于计算机内部地址总线的宽度。
在32位计算机中,一个指针变量的返回值必定是4。
指针变量的sizeof值与指针所指的对象没有任何关系。
三、 函数的sizeof
sizeof也可对一个函数调用求值,其结果是函数返回值类型的大小,函数并不会被调用。
对函数求值的形式:sizeof(函数名(实参表))
注意:1)不可以对返回值类型为空的函数求值。
2)不可以对函数名求值。
3)对有参数的函数,在用sizeof时,须写上实参表。
例子:
float FuncP(int a, float b)
{
return a + b;
}
int FuncNP()
{
return 3;
}
void Func()
{
}
int main()
{
cout<<sizeof(FuncP(3, 0.4))<<endl; //OK,值为4,sizeof(FuncP(3,0.4))相当于sizeof(float)
cout<<sizeof(FuncNP())<<endl; //OK,值为4,sizeof(FuncNP())相当于sizeof(int)
/*cout<<sizeof(Func())<<endl; //error,sizeof不能对返回值为空类型的函数求值*/
/*cout<<sizeof(FuncNP)<<endl; //error,sizeof不能对函数名求值*/