关于c++中sizeof的一个问题

#include <iostream.h>
void fun(char []);
void main()
{
char a[]={65,66,67,68,69,70,71,72};
cout<<sizeof(a)<<endl;
cout<<a<<endl;
fun(a);
}

void fun(char b[])
{
cout<<sizeof(b)<<endl;
cout<<b<<endl;
}
结果:
8
ABCDEFGH?(还有一个键盘上没有的字符,一共10个)
4
ABCDEFGH?(和上面一样)
为什么一个8一个4?a和b不是一样的吗?
b是数组的起始地址,a不也是数组的起始地址吗?a是数组名,同时它也是地址啊。a和b指向同一内存地址啊。为什么sizeof(a)就不是4了?

//b是数组的起始地址,a不也是数组的起始地址吗?a是数组名,同时它也是地址啊。a和b指向同一内存地址啊。为什么sizeof(a)就不是4了?

老不看清楚!b已经退化为指针,当然不一样。a虽然和b指向同一内存地址,但是定义阿a的时候不是还有一个N吗?(char a[N]),虽然你在程序中没写,但编译器可以计算出来,所以计算sizeof(a),它直接读N就可以了。b作为函数参数,系统不会自动把N也、传进去,淡然只能作为指针来计算。

char a[]={65,66,67,68,69,70,71,72};
cout<<sizeof(a)<<endl; //根据上面的定义知道数组的大小是8
cout<<a<<endl; //但是由于字符数组没有结束符号'\0',输出的字符串就是不可预料的, a所占内存后面的内存的内容同样会被输出

void fun(char b[])
{
cout<<sizeof(b)<<endl; //数组作为参数,已经退化为指针,指针大小固定为4
cout<<b<<endl; //同上
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-04-22
sizeof是求系统分配了多少个字节的内存空间
1.sizeof(a) a是一个字符数组名,里面存了8个字符所以sizeof(a)=8

2.b也是一个字符数组名,可是因为b[]是作函数的形参,所以自动转化为指针,也就是说在这种情况下,b相当于是一个字符数组的首地址,系统只分配一个指针的长度给他。sizeof(b) = 4.
********************************************
b作为函数参数时,传的是一个指针,而并不会传一个数组进去,这是一个规则。应当记住。
第2个回答  2008-04-21
你定义的时候a[],b[]
所以,运行出来a的结果是8,而b的结果是4的原因是,他是一个参数,C++中对于参数的存贮地址的分配是,不管b[]多大,都只分配4个存贮空间,就好像int只有2个存贮空间一样。所以b的大小只有四个。
你可以把b[]定义完整,改成b[8],这时候b也只有四个,C++和C中都把传递参数中的数值忽略,所以b只有四个大小。
第3个回答  2008-04-21
a是字符串数组,而非指针,他有内存,因为是8个char,一个char的size是1,所以是8

而b是通过fun函数传递的型参,传进来的只是一个指针,指向那片内存的首地址,指针的大小是4
第4个回答  2008-04-21
main()中a为数组名,sizeof(a)求的是所有数组元素的总大小.
fun()形参b实际是一个指向char类型的指针,不论实参有多少元素
sizeof(b)都是4.
第5个回答  2008-04-21
我想在到为什么?
指针好像系统只分配两个字节的内存空间,至于你那个我也很想知道为什么啊!!
相似回答
大家正在搜