C++的函式的傳值呼叫、指標呼叫、引用呼叫的聯絡區別
當呼叫函式時,有兩種向函式傳遞引數的方式:
呼叫型別 | 描述 |
---|---|
傳值呼叫 | 該方法把引數的實際值複製給函式的形式引數。在這種情況下,修改函式內的形式引數對實際引數沒有影響。 |
指標呼叫 | 該方法把引數的地址複製給形式引數。在函式內,該地址用於訪問呼叫中要用到的實際引數。這意味著,修改形式引數會影響實際引數。 |
引用呼叫 | 該方法把引數的引用複製給形式引數。在函式內,該引用用於訪問呼叫中要用到的實際引數。這意味著,修改形式引數會影響實際引數。 |
預設情況下,C++ 使用傳值呼叫來傳遞引數。一般來說,這意味著函式內的程式碼不能改變用於呼叫函式的引數。之前提到的例項,呼叫 max() 函式時,使用了相同的方法。
C++ 傳值呼叫
向函式傳遞引數的傳值呼叫方法,把引數的實際值複製給函式的形式引數。在這種情況下,修改函式內的形式引數不會影響實際引數。
預設情況下,C++ 使用傳值呼叫方法來傳遞引數。一般來說,這意味著函式內的程式碼不會改變用於呼叫函式的實際引數。函式 swap() 定義如下:
// 函式定義 void swap(int x, int y) { int temp; temp = x; /* 儲存 x 的值 */ x = y; /* 把 y 賦值給 x */ y = temp; /* 把 x 賦值給 y */ return; }
現在,讓我們通過傳遞實際引數來呼叫函式 swap():
例項
#include <iostream> using namespace std; // 函式宣告 void swap(int x, int y); int main () { // 區域性變數宣告 int a = 100; int b = 200; cout << "交換前,a 的值:" << a << endl; cout << "交換前,b 的值:" << b << endl; // 呼叫函式來交換值 swap(a, b); cout << "交換後,a 的值:" << a << endl; cout << "交換後,b 的值:" << b << endl; return 0; }
當上面的程式碼被編譯和執行時,它會產生下列結果:
交換前,a 的值: 100 交換前,b 的值: 200 交換後,a 的值: 100 交換後,b 的值: 200
上面的例項表明了,雖然在函式內改變了 a 和 b 的值,但是實際上 a 和 b 的值沒有發生變化。
C++ 指標呼叫
向函式傳遞引數的指標呼叫方法,把引數的地址複製給形式引數。在函式內,該地址用於訪問呼叫中要用到的實際引數。這意味著,修改形式引數會影響實際引數。
按指標傳遞值,引數指標被傳遞給函式,就像傳遞其他值給函式一樣。因此相應地,在下面的函式 swap() 中,您需要宣告函式引數為指標型別,該函式用於交換引數所指向的兩個整數變數的值。
// 函式定義
void swap(int *x, int *y)
{
int temp;
temp = *x; /* 儲存地址 x 的值 */
*x = *y; /* 把 y 賦值給 x */
*y = temp; /* 把 x 賦值給 y */
return;
}
如需瞭解 C++ 中指標的更多細節,請訪問 C++ 指標 章節。
現在,讓我們通過指標傳值來呼叫函式 swap():
#include <iostream>
using namespace std;
// 函式宣告
void swap(int *x, int *y);
int main ()
{
// 區域性變數宣告
int a = 100;
int b = 200;
cout << "交換前,a 的值:" << a << endl;
cout << "交換前,b 的值:" << b << endl;
/* 呼叫函式來交換值
* &a 表示指向 a 的指標,即變數 a 的地址
* &b 表示指向 b 的指標,即變數 b 的地址
*/
swap(&a, &b);
cout << "交換後,a 的值:" << a << endl;
cout << "交換後,b 的值:" << b << endl;
return 0;
}
當上面的程式碼被編譯和執行時,它會產生下列結果:
交換前,a 的值: 100 交換前,b 的值: 200 交換後,a 的值: 200 交換後,b 的值: 100
C++ 引用呼叫
向函式傳遞引數的引用呼叫方法,把引用的地址複製給形式引數。在函式內,該引用用於訪問呼叫中要用到的實際引數。這意味著,修改形式引數會影響實際引數。
按引用傳遞值,引數引用被傳遞給函式,就像傳遞其他值給函式一樣。因此相應地,在下面的函式 swap() 中,您需要宣告函式引數為引用型別,該函式用於交換引數所指向的兩個整數變數的值。
// 函式定義
void swap(int &x, int &y)
{
int temp;
temp = x; /* 儲存地址 x 的值 */
x = y; /* 把 y 賦值給 x */
y = temp; /* 把 x 賦值給 y */
return;
}
現在,讓我們通過引用傳值來呼叫函式 swap():
#include <iostream>
using namespace std;
// 函式宣告
void swap(int &x, int &y);
int main ()
{
// 區域性變數宣告
int a = 100;
int b = 200;
cout << "交換前,a 的值:" << a << endl;
cout << "交換前,b 的值:" << b << endl;
/* 呼叫函式來交換值 */
swap(a, b);
cout << "交換後,a 的值:" << a << endl;
cout << "交換後,b 的值:" << b << endl;
return 0;
}
當上面的程式碼被編譯和執行時,它會產生下列結果:
交換前,a 的值: 100 交換前,b 的值: 200 交換後,a 的值: 200 交換後,b 的值: 100