打印

sizeof 用在数组上(特别是将数组名作为参数)

[复制链接]
1771|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huzixian|  楼主 | 2011-1-15 19:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
还记得sizeof吧?它可以求一个变量某数据类型占用多少个字节。比如,sizeof(int)得到4,因为int类型占用4个字节。或者:
int i;
char c;
cout << sizeof(i) << "," << sizeof(c);
将输出4和1。
sizeof 用在数组上,有两个要点:
1、可以用通过它来计算一个数组的元素个数。
2、当数组是函数的参数时,sizeof对它不可用。

一、用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个元素。
这些我们都已经知道,但下面的事情有些例外。

二、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个字节即可。再打比方吧,如果你想你现在居住的三房二厅的房子送给我,你有两种办法:第一是把整个房子用倚天屠龙刀从楼幢里切出,然后买一巨大的信封(意指占用很大内存),寄给我(意指将整个实际数组传给函数);另一种方法是将你的家钥匙用个小信封寄过来。
整来整去,我们一直在复习函数参数的内容啊?不过有什么办法呢?当涉及到把数组作为参数,就不得不直面对“传址”的理解。归结为一首儿歌吧:
“传值”传复制
“传址”传地址
数组当参数
固定传地址

相关帖子

沙发
-自己人| | 2011-1-15 23:29 | 只看该作者
普及教育

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

262

主题

1534

帖子

2

粉丝