sizeof 操作符的作用是返回一个对象或类型名的长度,返回值的类型为size_t(第 3.5.2 节),长度的单位是字节(第 2.1 节)。size_t 表达式的结果是编译时常量,该操作符有以下三种语法形式:
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 的结果部分地依赖所涉及的类型:
对 char 类型或值为 char 类型的表达式做 sizeof 操作保证得 1。
对引用类型做 sizeof 操作将返回存放此引用类型对象所需的内在空间大小。
对指针做 sizeof 操作将返回存放指针所需的内在大小;注意,如果要获取该指针所指向对象的大小,则必须对指针进行引用。
对数组做 sizeof 操作等效于将对其元素类型做 sizeof 操作的结果乘上数组元素的个数。
因为 sizeof 返回整个数组在内存中的存储长度,所以用 sizeof 数组的结果除以 sizeof 其元素类型的结果,即可求出数组元素的个数:
// sizeof(ia)/sizeof(*ia) returns the number of elements in ia int sz = sizeof(ia)/sizeof(*ia);
例子:
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
注意:其中最重要的一点就是sizeof(p)的结果是指针变量p 所占据的存储空间的字节数,而不是数组的大小