sizeof操作符的作用是返回一个对象或类型名的长度,返回值的类型为size_t,长度的单位是字节.sizeof表达式的结果是编译时常量,该操作符有以下三种语法形式:
sizeof (type name);
sizeof (expr);
sizeof expr;
将sizeof应用在表达式expr上,将获得该表达式的结果的类型长度:
Sales_item item,*p;
//three ways to obtain size required to hold an object of type Sales_item
sizeof(Sales_item); //size required to hold an object of type Sales_item
sizeof item; //size of item's type,e.g.,sizeof(Sales_item)
sizeof *p; //size of type to which p points,e.g.,sizeof(Sales_item)
将sizeof用于expr时,并没有计算表达式expr的值.特别是在sizeof *p中,指针p可以持有一个无效地址,因为不需要对p做解引用操作.
使用sizeof的结果部分地依赖所涉及的类型:
a.对char类型或值为char类型的表达式做sizeof操作保证得1.
b.对引用类做sizeof操作将返回存放此引用类型对象所需的内存空间大小.
c.对指针做sizeof操作将返回存放指针所需的内存大小;注意,如果要获取该指针所指向对象的大小,则必须对该指针进行解引用.
d.对数组做sizeof操作等效于将对其元素类型做sizeof操作的结果乘上数组元素的个数.因为sizeof返回整个数组在内存中的存储长度,所以用sizeof数组的结果除以sizeof其元素类型的结果,即可求出数组元素的个数:
//sizeof(ia)/sizeof(*ia) returns the number of elements in ia
int sz=sizeof(ia)/sizeof(*ia);
习题 5.22 编写程序输出每种内置类型的长度
#include<iostream>
using namespace std;
int main()
{
cout<<"type/t/t/t"<<"size"<<endl
<<"bool/t/t/t"<<sizeof(bool)<<endl
<<"char/t/t/t"<<sizeof(char)<<endl
<<"signed char/t/t"<<sizeof(signed char)<<endl
<<"unsigned char/t/t"<<sizeof(unsigned char)<<endl
<<"wchar_t/t/t/t"<<sizeof(wchar_t)<<endl
<<"short/t/t/t"<<sizeof(short)<<endl
<<"signed short/t/t"<<sizeof(signed short)<<endl
<<"unsigned short/t/t"<<sizeof(unsigned short)<<endl
<<"int/t/t/t"<<sizeof(int)<<endl
<<"signed int/t/t"<<sizeof(signed int)<<endl
<<"unsigned int/t/t"<<sizeof(unsigned int)<<endl
<<"long/t/t/t"<<sizeof(long)<<endl
<<"signed long/t/t"<<sizeof(signed long)<<endl
<<"unsigned long/t/t"<<sizeof(unsigned long)<<endl
<<"float/t/t/t"<<sizeof(float)<<endl
<<"double/t/t/t"<<sizeof(double)<<endl
<<"long double/t/t"<<sizeof(long double)<<endl;
return 0;
}
习题5.23 预测下列程序的输出,并解释你的理由.然后运行该程序,输出的结果和你预测的一样吗?如果不一样,为什么?
int x[10];int *p=x;cout<<sizeof(x)/sizeof(*x)<<endl;
cout<<sizeof(p)/sizeof(*p)<<endl;
在表达式sizeof(x)中,x是数组名,该表达式的结果为数组x所占据的存储空间的字节数,为10个int型元素所占据的字节数.
表达式sizeof(*x)的结果是指针常量x所指向的对象(数组第一个int型元素)所占据的存储空间的字节数
表达式sizeof(p)的结果是指针变量p所占据的存储空间的字节数.
表达式sizeof(*p)的结果是指针变量p所指向的对象(一个int型数据)所占据的存储空间的字节数
各种数据类型在不同的系统中所占据的字节数不一定相同,因此在不同的系统中运行上述程序段得到的结果不一定相同.在Microsoft Visual C++.NET 2003系统中,一个int型数据占据4个字节,一个指针型数据也占据4个字节,因此运行上述程序得到的输出结果为:
10
1