C语言学习笔记(一):函数参数是数组

C语言学习笔记(一):函数参数是数组,第1张

我们运行下面这段代码,可以发现主函数只是把实参的值传给形参,调用函数add后仍然不改变主函数里a和b的值。

#include 
int add(int a, int b);
int main()
{
	int a = 2;
	int b = 3;
	printf("a+b=%d\n", add(a, b));
	printf("%d %d", a, b);

	return 0;

}int add(int a, int b) {
	a += b;
	return a;
}

运行结果如下:

我们再运行这段代码,调用函数aver后输出数组a[ ]里面的值,发现a[ ]发生了变化:

#include 
float aver(float a[], int len);
int main()
{
	float a[] = {0,1,2,3,};

	int len=sizeof(a)/sizeof(int);
	
	printf("the average value of a is=%f\n", aver(a, len));
	
	for(int i=0;i<len;i++){
		printf("%f\n",a[i]);
	}

    return 0;

}
float aver(float a[], int len) {
	float result=0;
	for(int i=0;i<len;i++){
		a[i]/=len;
		result+=a[i];
	}
	return result;
}


这是因为函数参数表里的数组其实是个指针,指向函数的首地址,也就是a[0]的地址。

调用这个函数的时候,主函数传递的不再是数组里的元素,而是会把数组的首地址传给它,函数找到这个数组后会直接在原数组上 *** 作。

所以这几种参数表的写法是等价的(后两个也是正确的,编译器不检查名称,只检查类型):

float aver(float *a, int len)
float aver(float a[], int len)
float aver(float *, int len)
float aver(float [], int len)

当我们需要在函数中对数组进行 *** 作时,最好再复制一个数组,以免改变了原先的函数值。

另外也可以使用

const int a[]={0,1,2,3,};

使a[ ]在创建时赋的值不能被修改,保护数组值不受破坏。

另一方面,当我们想要改变实参的值,可以用指针作为函数参数,是函数调用省略了值传递的环节,也能减少值传递带来的开销。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/662208.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-18
下一篇 2022-04-18

发表评论

登录后才能评论

评论列表(0条)

保存