值调用
就是调用函数时,给形参分配内存空间,将实参拷贝给形参,之后的函数执行中形参和实参就脱离了关系,谁都不影响谁。也就是值调用时,只是用实参的值初始化下形参,之后两者互不影响。
例子
#include<iostream> using namespace std; void Swap(int a, int b); int _tmain(int argc, _TCHAR* argv[]) { int x=5, y=10; cout<<"x="<<x<<" y="<<y<<endl; Swap(x,y); cout<<"x="<<x<<" y="<<y<<endl; return 0; } void Swap(int a, int b) { int t; t=a; a=b; b=t; }
运行结果是:
x=5 y=10
x=5 y=10
引用调用
如果我们想让被调函数中对形参做的修改同样对主调函数中的实参有效,用值调用不行,那怎么办呢?答案是用引用调用
引用是一种特殊类型的变量,我们可以认为它是另一个变量的别名,利用引用名和原来的变量名访问变量的效果是一样的。引用的形式是:类型标识符 &引用名。比如:
int i, j;
int &ri=i; // 建立一个int型的引用ri,并将其初始化为变量i的一个别名
j=10;
ri=j; // 相当于 i=j;
自己编写的用来学习实参与形参的例子
1 #include "stdafx.h" 2 #include "iostream" 3 using namespace std; 4 void Swap(int a,int b); 5 int _tmain(int argc, _TCHAR* argv[]) 6 { 7 8 int x = 5; 9 int y = 10; 10 cout <<"x= "<<x<<" x's address"<<&x<<endl; 11 cout<<"y= "<<y<<" y's address"<<&y<<endl; 12 Swap(x,y); 13 14 cout <<"交换完成后\n"<<"x= "<<x<<" x's address"<<&x<<endl; 15 cout<<"y= "<<y<<" y's address"<<&y<<endl; 16 return 0; 17 } 18 19 void Swap(int a,int b) 20 { 21 int t; 22 t = a; 23 a = b; 24 b = t; 25 cout <<"exchanging\n"<<"a= "<<a<<" a's address"<<&a<<endl; 26 cout<<"b= "<<b<<" b's address"<<&b<<endl;
可以看到在交换中产生了新的内存空间,因此形参和实参相互独立了,因此没有达到程序想要的结果。
引用:
1 #include "stdafx.h" 2 #include "iostream" 3 using namespace std; 4 void Swap(int& a,int& b); 5 int _tmain(int argc, _TCHAR* argv[]) 6 { 7 8 int x = 5; 9 int y = 10; 10 cout <<"x= "<<x<<" x's address"<<&x<<endl; 11 cout<<"y= "<<y<<" y's address"<<&y<<endl; 12 Swap(x,y); 13 14 cout <<"交换完成后\n"<<"x= "<<x<<" x's address"<<&x<<endl; 15 cout<<"y= "<<y<<" y's address"<<&y<<endl; 16 return 0; 17 } 18 19 void Swap(int& a,int& b)// 可以理解为 int& a = x; int& b = y 因此仅仅是别名,不分配新的内存 20 { 21 int t; 22 t = a; 23 a = b; 24 b = t; 25 cout <<"exchanging\n"<<"a= "<<a<<" a's address"<<&a<<endl; 26 cout<<"b= "<<b<<" b's address"<<&b<<endl; 27 28 }
可以看到,交换成功了