先上測試代碼:
#include<iostream>
using namespace std;
// 變量作為函數(shù)參數(shù)
void swap1(int a, int b) {
int t;
t = a;
a = b;
b = t;
}
// 指針作為函數(shù)參數(shù)
void swap2(int *a, int *b) {
int t;
t = *a;
*a = *b;
*b = t;
}
// 引用作為函數(shù)參數(shù)
void swap3(int &a, int &b) {
int t;
t = a;
a = b;
b = t;
}
// 指針的指針作為函數(shù)參數(shù)
void move1(int *a) {
a = a+1;
}
void move2(int **a) {
*a = *a+1;
}
int main() {
int x(5), y(10);
cout<<"變量作為函數(shù)參數(shù):"<<endl
<<"x="<<x<<", y="<<y<<"\nswap1: ";
swap1(x,y);
cout<<"x="<<x<<", y="<<y<<endl;
int *px=&x, *py=&y;
cout<<"\n指針作為函數(shù)參數(shù):"<<endl
<<"x="<<x<<", y="<<y<<"\nswap2: ";
swap2(px,py);
cout<<"x="<<x<<", y="<<y<<endl;
cout<<"\n引用作為函數(shù)參數(shù):"<<endl
<<"x="<<x<<", y="<<y<<"\nswap3: ";
swap3(x,y);
cout<<"x="<<x<<", y="<<y<<endl;
cout<<"\n指針的指針作為函數(shù)參數(shù):"<<endl;
int a[] = {1,2,3,4};
int *pa = a;
cout<<"a[0]: "<<a[0]<<endl
<<"調(diào)用move1前*pa="<<*pa<<endl;
move1(pa);
cout<<"調(diào)用move1后*pa="<<*pa<<endl;
move2(&pa);
cout<<"調(diào)用move2后*pa="<<*pa<<endl;
}
輸出為
變量作為函數(shù)參數(shù):
x=5, y=10
swap1: x=5, y=10
指針作為函數(shù)參數(shù):
x=5, y=10
swap2: x=10, y=5
引用作為函數(shù)參數(shù):
x=10, y=5
swap3: x=5, y=10
指針的指針作為函數(shù)參數(shù):
a[0]: 1
調(diào)用move1前*pa=1
調(diào)用move1后*pa=1
調(diào)用move2后*pa=2
swap1()
swap1()中開辟新的內(nèi)存空間分配給a和b棋凳,并非別被賦值x、y谓谦,swap1()中a和b交換了值贫橙,但隨著swap1()退出贪婉,a反粥、b的內(nèi)存空間被清理,并未改變x疲迂、y的值才顿,因此交換值失敗。
swap2()
swap2()用指針作為形參尤蒿,傳入的是x和y的地址郑气,在swap內(nèi)部直接對x和y進行操作,因此交換值成功腰池。
swap3()
swap3()用引用作為函數(shù)形參尾组,在swap內(nèi)部并未開辟新的內(nèi)存空間,是直接對x和y進行的操作示弓,a和b只是相當于x和y的別名(可參見引用的定義)讳侨,因此交換成功。
move1()
move1的本意是想改變指針奏属,因此將指針輸入move1()跨跨,但無奈move1()的形參是個指針,隨著move1()退出囱皿,形參被從內(nèi)存中清理勇婴,并沒有影響pa,move失敗嘱腥。
(以下是復雜解釋耕渴,可忽略。齿兔。橱脸。)
move1()用指針作為函數(shù)形參。指針pa表示開辟了一塊內(nèi)存用來存數(shù)組a首元素的地址愧驱。在move1()中慰技,又開辟了一塊新內(nèi)存作為局部變量指針a,這個局部變量a被pa賦值组砚,相當于局部變量a內(nèi)存著數(shù)組a的首元素地址吻商,即指針a指向數(shù)組a的首元素。move1()內(nèi)部+1操作使得局部指針a指向數(shù)組a的第二個元素糟红。但隨著move1()退出艾帐,局部指針a被清理出內(nèi)存乌叶,并沒有影響到外部指針pa,因此move失敗柒爸。
move2()
為改變指針pa准浴,move2()用指針的指針作為形參,與swap2()異曲同工捎稚,真是可愛乐横。