数组复制传递问题 大家进来帮帮忙 谢谢

来源:百度知道 编辑:UC知道 时间:2024/05/29 18:44:19
我是一个c++的新手 所以有几个不清楚的问题要请教大家 在这里先谢谢大家了!下面是程序代码:
#include <iostream>
using namespace std;
double testarray (double b[],int size);
void main(void)
{
double a[5]={1.1,2.1,3.1,4.1,5.1},r(0);
r=testarray(a,5);
cout<<"result="<<r<<endl;//这里的r不是调用了函数testarray了吗,应该将b[3]=0,为什么还是输出原来的值啊即15.5?
r=0;
for(int i=0;i<5;i++)
r+=a[i];
cout<<"r="<<r<<endl;//反而这里的r是原来的值却变成了改变的值即变成了10.4!!
}
double testarray(double b[],int size)
{
double s(0);b++;for(int i=0;i<size;i++)
s+=b[i-1];//这里的为什么是b[i-1]呀,当i=0时候 那不是b[-1]吗?那不是错误的吗?
b[3]=0;

return (s);
}
我将我的疑问备注到了语句的旁边,请大家详细的跟我说说谢谢了,对了书上是这样说的:大家来看看
循环语句为了访问实参数组的所有元素需要下标减一。在testarray函数中,在执行返回值语句之前,修改了形参b[3]的数值,实际上修改了a[4]德数值!(不明白,大家帮忙说说,在这里先谢谢大家了!)

第一个问题:
cout<<"result="<<r<<endl;//这里的r不是调用了函数testarray了吗,应该将b[3]=0,为什么还是输出原来的值啊即15.5?
因为testarray返回的是未修改前的数组的和。即for(int i=0;i<size;i++)
s+=b[i-1];至于这里为什么是b[i-1],那是因为前面b++了。此时b已经指向a[1]了,所以要求整个数组的和就要用b[i-1].即从a[0]开始加起。
第2个问题:
for(int i=0;i<5;i++)
r+=a[i];
cout<<"r="<<r<<endl;//反而这里的r是原来的值却变成了改变的值即变成了
因为这次求的和是数组已经改变之后的。在testarray中,b[3]=0.前面说了,b++过一次,所以b[3]此时指向的是a[4]而不是a[3].改变之后的数组变为
a[5]={1.1,2.1,3.1,4.1,0}.求和自然是10.4
第三个问题前面已经回答了

至于为什么“我想说在在语句(2)和(3)之前就有了语句(1)了 为什么只是(3)的改变了列! 要输出也是都一样啊!! 怎么看啊!麻烦你再 解释下 !谢谢啊!自己很困惑阿!谢谢了!”
原因在于testarray函数中是先对数组进行求和,也就是求得结果是15.5,然后才改变数组。你注意看下,是先进行for循环,然后才是b[3]=0的,理解了吗

兄弟,我也是学C++过来的,有时候碰见不会的地方就和挂了一回似的....

言归正传:
你的错误主要有两点:第一是你没注意for语句默认的循环体范围;第二就是你对形式参数和实际参数间的关系没搞明白.
(从上到下说你的提问)

1.如果你没对for语句的循环体用花括号特殊说明,for只默认它下面的第一个语句为其循环体.如:
double s(0);b++;for(int i=0;i<size;i++) (1)