C++传值方式和传址方式(以交换函数为例)
//以下三个函数都是实现将变量 i 和 j 的值交换 /*=========================方式一=====================================*/ /****************下面的函数无法实现此功能********************************/ /*==================================================================*/ #include <iostream> using namespace std; int main() { void swap(int, int); //函数声明 int i=3; int j=5; swap(i,j); cout << i << " "<<j <<endl; return 0; } void swap(int a,int b) { int temp; temp=a; a = b; a=temp; } /*=========================方式二====================================*/ /********************使用指针变量作形参,实现两个变量的值的交换********/ /*==================================================================*/ #include <iostream> using namespace std; int main() { void swap(int *, int *); int i=3; int j=5; swap(&i, &j); cout << i << " "<< j <<endl; return 0; } void swap(int *p1,int *p2) { int temp=0; temp=*p1; *p1=*p2; *p2=temp; } /*==========================方式三==================================*/ /**********************实现两个变量的值的交换,用“引用”作形参**************/ /*==================================================================*/ #include <iostream> using namespace std; int main() { void swap(int &, int &); int i=3; int j=5; swap(i, j); cout << i << " "<< j <<endl; return 0; } void swap(int &a, int &b) { int temp; temp=a; a=b; b=temp; }
总结:
1、方式一未能实现两个参数的交换。
2、前两种方式传递的是实参的值。即是传值方式
3、前两种方式在调用swap函数时,对形参要分配存储单元,方式三对引用型形参a和b不分配存储单元,它们分别与实参i和j共享同一存储单元。而方式三swap函数传递的是实参变量的地址而不是实参变量的值。即传址方式。
4、在方式三中,&a不是"a的地址",而是指“a是一个整形变量的(引用)别名”,&是引用声明符。由于是形参,不必对其初始化,即未指定它们是哪个变量的别名。当main函数调用swap函数时,进行虚实结合,把实参变量i和j的地址传给形参a和b.这样i和j的地址传给a and b.这样i和a的地址相同,二者是同一变量,即a成为i别名。同理,b成为j的别名。在swap函数中,a和b的值交换,那么i和j的值也交换了。