C语言题目 - 编写一个函数实现一维数组求和

题目

如题

思路

主要是通过在 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>