關於函數參數的傳遞方式
傳值參數:
實際參數的值被復制到由函數開辟的內存空間中,成為形參的初始值。完成參數值傳遞之后,函數體中的語句對形參的訪問、修改都是在這個標識對象上操作的,與實際參數無關。
實例:

#include<iostream> #include<cstring> using namespace std; void swap(int ,int); int main() { int a, b; cin >> a >> b; cout << "a=" << a << " b=" << b << endl; swap(a, b); cout << "a=" << a << " b=" << b << endl; system("pause"); } void swap(int a, int b) { int temp = a; a = b; b = temp; cout << "a=" << a << " b=" << b << endl; }
輸出結果:
理解:輸入4,5,賦給a,b。調用函數swap,把a,b的值傳遞給函數中的形參,在swap函數中,輸出交換后的形參的值。然后再main函數中輸出a,b的值,發現a,b實際上並沒有交換值,這是因為swap函數只對形參進行操作。
指針參數:
指針傳遞本質上和值傳遞差不多,實際上是把實際的指針參數傳遞給函數中創建的形參指針。不同的地方在於,指針傳遞的情況時,可以通過再函數中通過形參指針的間址訪問對實際變量做出更改,這是值傳遞無法做到的。
代碼:

#include<iostream> #include<cstring> using namespace std; void swap(int *, int *); int main() { int a, b; cin >> a >> b; cout << "a=" << a << " b=" << b << endl; swap(&a, &b); //把a,b的地址傳遞給swap函數 cout << "a=" << a << " b=" << b << endl; system("pause"); } void swap(int *p, int *q) { int temp = *p; //通過指針簡直訪問,交換a,b的值 *p = *q; *q = temp; }
引用參數:
與以上兩者不同的是函數調用時,形式參數不需要開辟新的存儲空間,形式參數名作為引用(別名)綁定與實際參數表示的對象上。執行函數體時,對形參的操作就是對實參對象操作。
代碼:
#include<iostream> #include<cstring> using namespace std; void swap(int &, int &); int main() { int a, b; cin >> a >> b; cout << "before swaping: "; cout << "a=" << a << " b=" << b << endl; swap(a, b); //實際參數是整形變量名 cout << "after swaping: "; cout << "a=" << a << " b=" << b << endl; system("pause"); } void swap(int &p, int &q) //形式參數是整形引用 { int temp = p; //通過名訪問,交換a,b的值 p = q; q = temp; }
使用const引用參數:
#include<iostream> #include<cstring> using namespace std; void swap(const int &,const int &); int main() { int a = 2, b = 55; cout << a << " " << b << endl; swap(a, b); cout << a << " " << b; } void swap(const int &a, const int &b) { int temp = a; a = b; //非法操作a所綁定的對象被約束為只讀,無法通過別名對該對象進行修改 b = temp; }
與上述類似,使用const關鍵字約束對指針變量所指向對象的訪問,這種指針稱為指向常量指針。
如:
int a=2,b=3;
const int *p1=&a; //聲明一個指向常量的指針並給指針初始化
const int *p2;
p2=&b; //可以通過,因為指向常量的指針只對指針所指向的對象進行約束,並不對指針本身進行約束,所以可以先聲明,后賦值
*p1=3; //非法,無法通過p1間接對a進行修改
a=3; //合法,a是int型變量,可以修改