函数参数传递三种方式(传值方式,地址传递,引用传递)
- 形参与实参
- 形参即形式上的参数,对实参的一种抽象类型描述只是声明一个函数能够接受什么类型的实参,而不确定接受的实参的具体内容是什么
- 实参即传递给函数对应形参的具体内容
- 参数传递两种方式--传值&传址
-
传值方式:将实参的值拷贝给函数或方法,在函数内对形参进行操作,操作的对象是实参的拷贝,对实参本身没有影响,在函数结束返回后,形参被丢弃释放,实参的内容不会被改变
-
传址方式:将实参的地址传递给函数,在函数内对形参进行操作等同于对实参进行相同的操作,在函数调用结束返回后,形参被释放,实参的内容是对形参进行操作后的结果。
传址又分为:引用传递&指针传递
-
- 值传递
1 void exchange1(int x,int y) 2 { 3 int temp; 4 temp=x; 5 x=y; 6 y=temp; 7 }
exchange1(a,b);在调用过程中,函数隐含的把实参a,b的值分别传给了x,y 函数中的操作只是对,xy的操作,没有对a,b 进行任何操作,因此啊,ab的值是不变的。
2.地址传递(指针)
1 void exchange2(int *px,int *py) 2 { 3 int temp=*px; 4 *px=*py; 5 *py=temp; 6 7 } 8 int a=4,b=5; 9 exchange2(&a,&b);
将ab的地址传递给函数,对*px,*py的操作即是对a,b变量本身的操作。可以实现a,b的值交换
3.引用传递
1 void exchange3(int &x,int &y) 2 { 3 int temp=x; 4 x=y; 5 y=temp; 6 7 } 8 9 int a=3,b=4; 10 exchange3(a,b);
仅形式参数的格式与值传递不同,内部定义域调用与值传递完全相同,可以实现ab值得对调
因为在x,y 前有一个取地址符号&,在调用exchang3(a,b)时会用替换x,y,称xy引用了变量ab,在函数内部便是对实参ab进行操作了,函数 内部可以直接修改a,b的值。
- 引用即对象的别名,传对象的引用,用于把一个对象的地址作为参数传递过去,而不是对象本身。引用传递,避免了一次实参到形参的拷贝,提高了效率。
- 引用,指针,传址使用原则
- 如果数据对象较小,如内置数据类型或小型结构,则按值传递
- 如果数据对象是数组,则使用指针,并将指针声明为指向const的指针
- 如果数据对象是较大的结构,则使用const指针或const引用,以提高运行效率,以减少复制结构所需要的时间和空间
- 如果数据对象是类对象,则使用const引用,传递类对象参数的标准方式是按引用传递。
如果出现类似的manmin(&x),其中x为int类型的值,那么函数将修改变量x的值。