1. 程式人生 > >C++的函式的傳值呼叫、指標呼叫、引用呼叫的聯絡區別

C++的函式的傳值呼叫、指標呼叫、引用呼叫的聯絡區別

當呼叫函式時,有兩種向函式傳遞引數的方式:

呼叫型別 描述
傳值呼叫 該方法把引數的實際值複製給函式的形式引數。在這種情況下,修改函式內的形式引數對實際引數沒有影響。
指標呼叫 該方法把引數的地址複製給形式引數。在函式內,該地址用於訪問呼叫中要用到的實際引數。這意味著,修改形式引數會影響實際引數。
引用呼叫 該方法把引數的引用複製給形式引數。在函式內,該引用用於訪問呼叫中要用到的實際引數。這意味著,修改形式引數會影響實際引數。

預設情況下,C++ 使用傳值呼叫來傳遞引數。一般來說,這意味著函式內的程式碼不能改變用於呼叫函式的引數。之前提到的例項,呼叫 max() 函式時,使用了相同的方法。

C++ 傳值呼叫

C++ 函式 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++ 指標呼叫

C++ 函式 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++ 引用呼叫

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 的值: 200
交換後,b 的值: 100