参数
实参(argument):
全称为"实际参数"是在调用时传递给函数的参数。是真实存在的数据。 实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。
形参(parameter):
全称为"形式参数" 由于它不是实际存在变量,所以又称虚拟变量。只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用。
注:函数调用中发生的数据传递是单向的,只能实参→形参,而不能形参→实参。即,一旦完成数据的传递,实参和形参就再没关系了。所以,在函数调用过程中,形参的值发生改变并不会影响实参。
参数传递:
值传递、址传递、引用传递三种方法。
关于是否能通过传参改变实际数据的测试:
int test(int a,int *b,int &c) {
//依次是值传递、址传递、引用传递
printf("当前传入参数a的值:%d\n",a);
printf("当前传入参数b的值:%d\n",*b);
printf("当前传入参数c的值:%d\n",c);
a = 40;
*b = 50;//需要注意!要用*b赋值
c = 70;
return a;
}
void main() {
int a = 10,b = 20,c = 30;
int d=test(a, &b,c);
printf("返回a的值:%d\n",d);
printf("打印出经过传参后a的值:%d\n",a);
printf("打印出经过传参后b的值:%d\n",b);
printf("打印出经过传参后c的值:%d\n",c);
}
结果为:
可以看到,值传递不能改变本身数据的值,只能通过return进行一个“数值结果”的传递,对参数本身不能产生影响。址传递与引用传递都能改变参数本身的取值。
区别:
传值:要建立参数的副本,用完再释放。效率低。任何的修改是在副本上作用,没有作用在原来的变量上。
传址:相当于建立指针变量的副本。原指针跟新副本指针都指向原数据,所做的操作也是对原数据进行修改。
传引用:相当于直接对指向的变量的操作,即对原数据的修改。(被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。)
用法:
指针传递和引用传递一般适用于:
1.函数内部修改参数并且希望改动影响调用者。
2.当一个函数实际需要返回多个值,而只能显式返回一个值时,可以将另外需要返回的变量以指针/引用传递给函数,这样在函数内部修改并且返回后,调用者可以拿到被修改过后的变量。
注:引用传递实际上是C++中的用法。如果VS所含“&”的参数报错,将文件后缀改为cpp即可。