前言:
形式参数(形参):出现在函数定义的地方,形参之间以“,”分隔,其规定了函数接受数据的类型和数量(参数的数目)
实际参数(实参):出现在函数调用的地方,用于初始化形参(实参的数目、类型与形参相同)。
一、值传递
值传递,顾名思义,仅仅传递实参的值,因而形参无法改变实参。
1 #include <iostream> 2 3 void swap(int a, int b) { 4 int temp; 5 temp=a; 6 a=b; 7 b=temp; 8 std::cout << "a is " << a << ";" << "b is " << b << std::endl; 9 10 } 11 12 int main(int argc, char * argv[]) { 13 int m=1,n=2; 14 std::cout << "m is " << m << ";" << "n is " << n << std::endl; 15 swap(m,n); 16 std::cout << "m is " << m << ";" << "n is " << n << std::endl; 17 }
执行上述代码可见如下结果:
1 m is 1;n is 2 2 a is 2;b is 1 3 m is 1;n is 2
可见当参数以值传递时,形参的改变并不会改变实参。
二、指针传递
指针传递,也就是将实参的地址传递给形参,因而可以修改实参的值,但是这种方法容易出错,导致参数被程序非法访问。
1 #include <iostream> 2 3 void swap(int *a, int *b) { 4 int temp_int=0; 5 int *temp_ptr=&temp_int; 6 temp_ptr=a; 7 a=b; 8 b=temp_ptr; 9 std::cout << "a is " << *a << ";" << "b is " << *b << std::endl; 10 11 } 12 13 int main(int argc, char * argv[]) { 14 int m=1,n=2; 15 std::cout << "m is " << m << ";" << "n is " << n << std::endl; 16 swap(&m,&n); 17 std::cout << "m is " << m << ";" << "n is " << n << std::endl; 18 }
指针传递实际上传递的是实参的地址,进而可以通过指针修改形参的值,但实参本身并没有发生变化。其结果如下所示:
1 m is 1;n is 2 2 a is 2;b is 1 3 m is 1;n is 2
三、引用传递
引用传递,此时形参就是实参的别名,因而可以修改实参的值。
1 #include <iostream> 2 3 void swap(int &a, int &b) { 4 int temp; 5 temp=a; 6 a=b; 7 b=temp; 8 std::cout << "a is " << a << ";" << "b is " << b << std::endl; 9 } 10 11 int main(int argc, char * argv[]) { 12 int m=1,n=2; 13 std::cout << "m is " << m << ";" << "n is " << n << std::endl; 14 swap(m,n); 15 std::cout << "m is " << m << ";" << "n is " << n << std::endl; 16 }
引用传递不同于前两者,此时的形参是实参的别名,因此对于形参的操作也就是对于实参的操作。
1 m is 1;n is 2 2 a is 2;b is 1 3 m is 2;n is 1
四、注意
1、传值或是传址本质上是一种拷贝操作,前者拷贝变量本身,后者拷贝变量的地址。对于某些class中类型对象或容器对象,拷贝操作比较低效,甚至有些类的类型不支持拷贝操作(IO类型)。因此在C++中我们应尽量采用引用避免拷贝。
2、利用引用传递我们也可以返回额外的信息(一个函数只能返回一个值,而引用调用可以改变实参帮助我们返回额外的信息)
五、参考
1、C++ Primer(中文版/第五版)——6.2.2(P188)
标签:传递,temp,形参,int,C++,参数传递,实参,拷贝 From: https://www.cnblogs.com/hjxiamen/p/16743590.html