我们运行下面这段代码,可以发现主函数只是把实参的值传给形参,调用函数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[ ]在创建时赋的值不能被修改,保护数组值不受破坏。
另一方面,当我们想要改变实参的值,可以用指针作为函数参数,是函数调用省略了值传递的环节,也能减少值传递带来的开销。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)