c语言之sizeof
转自:http://www.cnblogs.com/wangkangluo1/archive/2011/09/27/2193072.html
sizeof 用在数组上,有两个要点:
1、可以用通过它来计算一个数组的元素个数。
2、当数组是函数的参数时,sizeof对它不可用
sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。
二、sizeof的使用方法
1、用于数据类型
sizeof使用形式: sizeof(type)
数据类型必须用括号括住: sizeof(int)
2、用于变量
sizeof使用形式: sizeof(var_name) 或 sizeof var_name
变量名可以不用括号括住.如sizeof (var_name),sizeof var_name等都是正确形式
注意:sizeof操作符不能用于函数类型,不完全类型或位字段。
例如: sizeof(max)
三、sizeof的结果(以下结果都是在Linux v2.6 gcc v4获取)
sizeof操作符的结果类型是size_t
1、ANSI C正式规定字符类型为1字节。
2、其他类型在ANSI C中没有具体规定,大小依赖于实现。
3、当操作数是指针时,sizeof依赖于编译器。
4、当操作数具有数组类型时,其结果是数组的总字节数。
6、当操作数是联合类型时,sizeof是其最大字节成员的字节数。
struct a{
在Linux上: sizeof(a) = 12;
这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。
7、当操作数是函数中的数组形参或函数类型的形参:
四、sizeof与其他操作符的关系
sizeof的优先级为2级,比/、%等3级运算符优先级高。
五、sizeof的主要用途
1、主要用途是与存储分配和I/O系统那样的例程进行通信。
2、另一个的主要用途是计算数组中元素的个数。
完
==============================
还记得sizeof吧?它可以求一个变量某数据类型占用多少个字节。比如,sizeof(int)得到4,因为int类型占用4个字节。或者:
int i;
char c;
cout << sizeof(i) << "," << sizeof(c);
将输出4和1。
sizeof 用在数组上,有两个要点:
1、可以用通过它来计算一个数组的元素个数。
2、当数组是函数的参数时,sizeof对它不可用。
17.6.1 用sizeof自动计算元素个数
sizeof对于一个数组变量,则会得到整个数组所有元素占用字节之和:
int arr[5];
cout << sizeof(arr);
屏幕上显示:20。因为5个元素,每个元素都是int类型,各占用4字节,总和:4 * 5 = 20。
由这个可以算出某一数组含多少个元素:sizeof(arr) / sizeof(arr[0]) = 20 / 4 = 5。从而得知arr数组中有5个元素。
这些我们都已经知道,但下面的事情有些例外。
17.6.2 sizeof对数组参数不可用
对于一个从函数参数传递过来的数组,sizeof无法得到该数组实际占用字节数。
这句话什么意思呢?看看这个例子:
void Func(int arr[])
{
cout << sizeof(arr) << endl;
}
int main(int argc, char* argv[])
{
int b[20];
Func(b);
system("pause");
return 0;
}
程序将输出:4,而实际上,b占用的字节数应为:4 * 20 = 80;大家可以在调用Func(b)之前加一行:
cout << sizeof(b) << endl;
Func(b);
这样更可以发现,sizeof直接对b取值,得到的是正确的大小,而将b传给Func后,在Func内部对该参数取值,则只能得到:4。
为什么?
这正是我们前面说的,数组作为参数传给函数时,采用的是传址方式,固定只送了数组的地址过去,而用于存放数组的地址,仅需4个字节即可。再打比方吧,如果你想你现在居住的三房二厅的房子送给我,你有两种办法:第一是把整个房子用倚天屠龙刀从楼幢里切出,然后买一巨大的信封(意指占用很大内存),寄给我(意指将整个实际数组传给函数);另一种方法是将你的家钥匙用个小信封寄过来。
整来整去,我们一直在复习函数参数的内容啊?不过有什么办法呢?当涉及到把数组作为参数,就不得不直面对“传址”的理解。归结为一首儿歌吧:
“传值”传复制
“传址”传地址
数组当参数
固定传地址