C++字符串数组如何作为函数参数

voidTEST(string*y,string*x);intmain(){stringy[]={"y1","yb"};stringx[]={"x1","x2","x3"... void TEST(string *y,string *x);
int main(){
string y[]={"y1","yb"};
string x[]={"x1","x2","x3","x4"};
TEST(y,x);
cout<<sizeof(y)<<endl; //在主函数中y的长度的确是2*8=16
cout<<sizeof(x)<<endl; // 输出x的长度是4*8=32
return 0;
}
void TEST(string *y,string *x)
{
cout<<sizeof(y)<<endl; //调用出现问题,此处输出了y的长度为8
cout<<sizeof(x)<<endl; //此处输出了x的长度为8
}

为什么会出现这个问题?是调用出错还是函数参数部分写错?应该如何改正?
展开
 我来答
veilearner
2013-09-09
知道答主
回答量:2
采纳率:0%
帮助的人:2.6万
展开全部

 

sizeof(string),由于它们都是和系统相关的(我的操作系统是32位的),所以在不同的系统下取值可能不同,这务必引起注意,尽量不要在这方面给自己程序的移植造成麻烦。一般情况下,在32位系统中,sizeof(string)为16字节。


sizeof都和内存中的存储方式有关。你这里没有理清楚数组函数的传参的实质,你这里定义字串数组string
[]x, string []y;
 在main函数中,x,y都是数组, sizeof(x)的值为数组的长度*sizeof(string)。值得注意的是x也代表数组x中元素的首地址。这里不要把sizeof(x)的值理解为4(即指针的长度),但是在函数中的数组会定义为指针。

如你的函数:

void TEST(string *y,string *x){
 cout<<"test_y-> "<<sizeof(y)<<endl;   //这时候值为4(你的为8),因为在传参时传递的是首元素的地址,函数在内存空间定义一个指针类型y,指向数组y,这时候在内存中y实际为指针类型 

cout<<"test_x-> "<<sizeof(x)<<endl;                         
}

追问
我大致看懂了,我现在把这个数组传进函数里的时候,好像只读了第一个字符串,如果我希望把这个字符串数组完整地传进函数里面用的话该怎么办?
追答
void TEST(string *y,string *x){
cout " "<<sizeof(x)<<endl; //此处输出了x的长度为8
for(int i = 0; i < 4; i++)
cout<<x[i]<<" ";
cout<<endl;
}
bt714728157
2013-09-09 · 超过17用户采纳过TA的回答
知道答主
回答量:67
采纳率:0%
帮助的人:44.5万
展开全部
当数组名做形参在函数体内时,数组名失去了其常量特性,沦落为与指针相同四字节待遇的平民。
简单的讲,就是如果你想把数组传给一个函数,那么必须将这个数组的长度也传给这个函数。因为数组名当形参时,他就会退化成一个4字节的指针,同时这个数组的长度你也没法知道了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友cd8541ae4
2013-09-09 · TA获得超过264个赞
知道小有建树答主
回答量:126
采纳率:100%
帮助的人:114万
展开全部
这个是c++的语言特性的问题。
将数组作为函数参数,数组会退化成指针。
也就是在函数TEST中,y和x不再是数组,仅仅是指针。指针的长度都一样。
所以将数组作为参数传入时,一般会将数组长度作为另一个参数,不然函数无法判断数组长度。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
帐号已注销
推荐于2017-12-15 · TA获得超过3954个赞
知道大有可为答主
回答量:1636
采纳率:77%
帮助的人:1238万
展开全部
为啥要用C语言的数组呢? 你的这个问题是由于将数组传递给函数时数组的长度信息丢失导致。

C++有自己的“ 数组” : std::array std::vector std::dynarray

用这些更好,而且都是标准库,C++编译器可能优化这些“数组”的性能。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式