rambo

搞清sizeof

一、Defintion:

sizeof返回一个对象或类型名的长度,返回值的类型为size_t,长度单位为字节。sizeof可用于求类的大小及求结构体的大小。

语法形式:

解释:

(1) 类型作参数   (2)变量作参数

(3)数组名作参数,计算值为编译器为数组分配的内存空间。

(4)函数作参数,返回值为函数返回值所占用的内存空间(不必深究,无意义)

(5)指针作参数,返回指针所占的内存空间,一般为4个字节。这个概念有用!

指针是32位的物理地址,不管什么类型的指针,其大小为4.

(6)联合体(union)作参数

在一个联合内可以定义多种不同的数据类型,这些数据共享同一段内存,在不同的时间保存不同的数据类型和不同长度的变量,并且同一时间只能储存其中一个成员变量的值。 union的成员不可以为静态、引用等。

这里涉及到字节对齐的问题。一个联合体被声明时,编译程序自动产生一个变量,其长度为联合体中最大的变量长度的整数倍。

结论:复合数据类型,如union,struct,class的对齐方式为成员中对齐方式最大的成员的对齐方式。

二、深入理解sizeof 

参考自http://www.cnblogs.com/wanghetao/archive/2012/04/04/2431760.html

1、sizeof在编译阶段处理, sizeof作用范围内,即()里面的内容也不能被编译,而是被替换成类型,=操作符返回左操作数的类型,所以a=3相当于int.

结论:sizeof是不可能支持链式表达式的,这是和一元操作符不同之处。

2、关于动态数组的深入

3、向函数传递数组

解决方法是使用指针或者引用。

问题来了,这里传入数组的大小一定必须事先指明,那么这样也就失去了用sizeof计算数组大小的意义,所以需要一个额外的参数来说明数组的大小。