题目
如题
思路
主要是通过在 main() 函数最中将定义好的数组传入求和函数中并调用该函数对该数组元素进行求和
代码
#include<stdio.h>
int sum(int data[]);
int main()
{
int b[] = {1,2,3};//待求和的数组
printf("数组的元素和为:%d\n",sum(b));//将数组名传进去,调用sum函数
return 0;
}
int sum(int data[])
{
//int * p;
int i;
int sum = 0;
//p = data;
for (i = 0; i < sizeof(data) / sizeof(int); i++) //利用sizeof()求和
{
printf("%d ",data[i]);
sum += data[i];//求和
}
return sum;
}
输出结果:
1 数组的元素和为:1
可以看出上述代码只打印数组的第一个元素,并且和为1,说明循环只进行了一次。这是为什么呢?后来打印出 sizeof(data) / sizeof(int) 的值为1,因为:
在定义形参时出现了错误,此时拿出宝典翻一下:如果不知道形参和实参是否匹配,可以把形参放等号左边,实参放等号右边,也就是把实参赋值给形参,而这里是 int data[] = b,这肯定是不对的,因为等号左边是一个数组定义,而等号右边只是一个数组的首地址,它们并不匹配(但不是说这样的写法就是错的,只是说这样写完以后求 sizeof(data) 是 4 ,因为像上面那样赋值了以后实际上是 sizeof(b) = 4,不能求得正确的数组元素个数)。
而正确的形参应该是一个指针:int * data,这样的话虽然不能在 sum 函数中直接计算数组中元素个数,但是这样的形参是正确的。
修改后的代码
#include<stdio.h>
int sum(int data[], int n);
int main()
{
int b[] = {1, 2, 3, 5, 6, 8};
printf("数组的元素和为:%d\n",sum(b, sizeof(b) / sizeof(int)));
return 0;
}
int sum(int data[], int n)
{
int i;
int sum = 0;
for (i = 0; i < n; i++)
{
printf("%d ",data[i]);
sum += data[i];
}
return sum;
}
这种还是比较传统的一种,没有使用指针的代码
#include<stdio.h>
int sum(int * data, int n);//形参转换成指针形式,增加了参数n用来传数组的长度
int main()
{
int b[] = {1, 2, 3, 5, 6, 8};
printf("数组的元素和为:%d\n",sum(b, sizeof(b) / sizeof(int)));
return 0;
}
int sum(int * data, int n)
{
int i;
int sum = 0;
for (i = 0; i < n; i++)
{
sum += *(data+i);
}
return sum;
}
输出结果:
25
以上是复制传递参数方式的代码,还有一种传参方式是地址传递方式,主要思路是把指向数组的指针传进被调用函数中,形参是和数组同类型的指针,被调用函数封装指针移动取值并累加的过程:
#include<stdio.h>
int sum(int * data, int n);
int main()
{
int b[] = {1, 2, 3, 5, 6, 8};
int * pb = b; //定义一个指向数组的指针
printf("数组的元素和为:%d\n",sum(pb, sizeof(b) / sizeof(int))); //传入指针pb
return 0;
}
int sum(int * pa, int n)//形参是和数组同类型的指针
{
int i;
int sum = 0;
for (i = 0; i < n; i++)
{
printf("%d ",*(pa+i));
sum += *(pa+i); //通过指针移动遍历并累加
}
return sum;
}
4210

被折叠的 条评论
为什么被折叠?



