值調用
就是調用函數時,給形參分配內存空間,將實參拷貝給形參,之后的函數執行中形參和實參就脫離了關系,誰都不影響誰。也就是值調用時,只是用實參的值初始化下形參,之后兩者互不影響。
例子
#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 }
可以看到,交換成功了