#include <iostream>
using namespace std ;
void Swap(int x, int y) ;
int main(void)
{
int a = 1 ;
int b = 2 ;
cout << "a = " << a << ", " << "b = " << b << endl ;
Swap(a, b) ;
cout << "a = " << a << ", " << "b = " << b << endl ;
system("pause") ;
return 0 ;
}
一:值傳遞
void Swap(int x, int y)
{
int temp = x ;
x = y ;
y = temp ;
}
輸出結果:
a = 1, b = 2
a = 1, b = 2
原因:Swap(int x, int y)函數采用值傳遞的方式,傳入的實參實際上是a和b的副本而非其本身,所以對副本的改變並不會反應到a和b本身上。這個例子很簡單,但是大一最開始學的時候,壓根就不理解,因為那時候對內存的原理和結構不熟悉!!!
二:引用傳遞
void Swap(int &x, int &y)
{
int temp = x ;
x = y ;
y = temp ;
}
輸出結果:
a = 1, b = 2
a = 2, b = 1
原因:Swap(int x, int y)函數采用引用傳遞的方式,傳入的實參實際上是a和b的引用,對引用的改變會直接反應到a和b本身上。引用是C++引進的語法,是一個很有用的工具吧,實質上就是包裝了指針,簡化程序猿的負擔,理解了指針才能理解引用,我們當然不能只停留在死記硬背上面,當然是要自己畫出數據在內存中的存儲方式。
三:指針傳遞
1. 改變指針本身
void Swap(int *x, int *y)
{
int *temp = x ;
x = y ;
y = temp ;
}
調用方法:Swap(&a, &b) ;
輸出結果:
a = 1, b = 2
a = 1, b = 2 //這里是不是讓你大吃一驚,反正我當時是驚呆了,這個當時還就是今年的4月時候,不過當時真沒有寫過這樣的指針形式,也沒有遇到這樣的情形,這個例子對加深函數的參數傳遞是很有幫助的,也就是說函數傳遞參數都是傳遞的實參的副本,即使是傳遞的指針副本,這個例子里面我們沒有對這個副本指針進行解除引用操作(*)也即間接引用,所以我們是訪問不到實參變量的,這里進行的賦值也只是對指針副本進行的賦值. 當時真的沒有想這么多哎,只是傻傻的以為指針很好用,能夠操作內存,好酷炫,還以為是很神秘的技術,原來也是傳遞的一個副本.只是C語言提供了對它操作內存的能力。用*操作就可以直接訪問實參變量...要用心(*)啊!!!不得不贊C語言.
原因:Swap(int x, int y)函數采用指針傳遞的方式,傳入的實參實際上是a和b的指針的副本,而且改變的是副本本身而非其間接引用,所以不會影響的指針所指向的值,即a和b本身上。
2. 改變指針的間接引用
void Swap(int *x, int *y)
{
int temp = *x ;
*x = *y ;
*y = temp ;
}
調用方法:Swap(&a, &b) ;
輸出結果:
a = 1, b = 2
a = 2, b = 1
原因:Swap(int x, int y)函數采用指針傳遞的方式,傳入的實參雖然也是a和b的指針的副本,但是改變的是副本的間接引用,無論是指針本身還是其副本,都指向相同的值,所以這個改變會反應到a和b本身
