C++引數的傳遞方式

qq_31660917發表於2020-09-29

C++引數的傳遞方式

————————————————————————供記憶學習和理解

1. 值傳遞

· 呼叫時,將實參的值傳遞給對應的形參。由於形參有自己獨立的儲存空間,又作為函式的區域性變數,故在函式中對任何形參值的修改,都不會改變實參變數的值。
· 典型的例子如下:

#include <iostream>
using namespace std;
void swap(int,int);
int main()
{
    int a = 1;
    int b = 2;
    cout << "交換前 a = " << a << "\tb = "<< b << endl;
    swap(a,b);
    cout << "交換後 a = " << a << "\tb = "<< b << endl;
    return 0;
}
void swap(int x, int y)
{
    int temp;
    temp = x;
    x = y;
    y = temp;
    cout << "交換函式swap內部 a = " << x <<"\tb = "<< y << endl;
}
//結果
交換前 a = 1    b = 2
交換函式swap內部 a = 2  b = 1
交換後 a = 1    b = 2

由上可知,主函式內全域性變數的a,b在執行函式swap呼叫後a和b值都沒有改變,只是在函式內部作了交換。
分析函式呼叫的過程:
(a)呼叫前,a、b有自己的儲存空間和初始值;
(b)呼叫時,為形參x、y分配了儲存空間,並將實參a、b的值一一對應過來,在函式執行過程中將x、y的值互換;
(c)呼叫結束後,x、y的儲存空間被釋放,a、b的值沒有影響

2. 引用傳遞

· 引用是一種特殊的變數,可認為是一個變數的別名。
· 定義引用變數的語法如下:

資料型別 & 引用名 = 變數名;

· 引用變數並不分配獨立的儲存空間,與所對應的變數共用同一個記憶體空間;定義時如果該引用變數不是作為函式的引數或返回值時,必須初始化,即提供所要引用的變數名。
· 以上例進行對比舉例如下:

#include <iostream>
using namespace std;
void swap(int&,int&);
int main()
{
    int a = 1;
    int b = 2;
    cout << "交換前 a = " << a << "\tb = "<< b << endl;
    swap(a,b);
    cout << "交換後 a = " << a << "\tb = "<< b << endl;
    return 0;
}
void swap(int& x, int& y) // 函式引數列表中定義了兩個引用變數x、y 
{
    int temp;
    temp = x;
    x = y;
    y = temp;
    cout << "交換函式swap內部 a = " << x <<"\tb = "<< y << endl;
}
//結果如下
交換前 a = 1    b = 2
交換函式swap內部 a = 2  b = 1
交換後 a = 2    b = 1

結果說明在函式swap呼叫過後,實參的值被改變。由此推斷,在函式呼叫時,作為形參的引用變數並不分配新的儲存空間,它將作為實參變數的別名和實參共用同一個記憶體空間,提高了執行效率。

故此,使用引用引數可以直接操作實參變數從而實現通過修改形參值而達到修改對應實參的目的。

3. 指標變數傳遞

採用指標變數作為函式的引數進行傳遞,所傳遞的是對應的地址。
3.1 形參變化影響實參的情況

#include <iostream>
using namespace std;
void swap(int* x,int* y);
int main()
{
    int a = 1, b = 2;
    int *p1 = &a, *p2 = &b;  //定義兩個指標變數,分別指向a、b,由於a、b中的值為int,故指標變數也為int. & 為取變數地址的操作符
    cout << "交換前 a = " << a << "\tb = "<< b << endl;
    swap(p1,p2);
    cout << "交換後 a = " << a << "\tb = "<< b << endl;
    return 0;
}
void swap(int* x, int* y) // 函式引數列表中定義了兩個指標變數x、y 
{
    int temp;
    temp = *x; // 取指標變數x的值(地址)所對應的變數的值,並賦值給temp
    *x = *y;
    *y = temp;
    cout << "交換函式swap內部 a = " << *x <<"\tb = "<< *y << endl;
}
//結果
交換前 a = 1    b = 2
交換函式swap內部 a = 2  b = 1
交換後 a = 2    b = 1

可見,函式呼叫時,p1、p2作為指向a、b的指標傳遞給對應的函式形參,在函式內部通過* 得到指標變數的地址所對應的值並進行交換,從而改變了實參的值。

3.2 形參變化不影響實參的情況

#include <iostream>
using namespace std;
void swap(int* x,int* y);
int main()
{
    int a = 1, b = 2;
    int *p1 = &a, *p2 = &b;  //定義兩個指標變數,分別指向a、b,由於a、b中的值為int,故指標變數也為int. & 為取變數地址的操作符
    cout << "交換前 a = " << a << "\tb = "<< b << endl;
    swap(p1,p2);
    cout << "交換後 a = " << a << "\tb = "<< b << endl;
    return 0;
}
void swap(int* x, int* y) // 函式引數列表中定義了兩個指標變數x、y 
{
    int *temp; // 定義了一個指標變數
    temp = x; // 以下是對地址進行了交換
    x = y;
    y = temp;
    cout << "交換函式swap內部 a = " << *x <<"\tb = "<< *y << endl;
}
交換前 a = 1a的地址:000000633B0FF7A4   b = 2b的地址:000000633B0FF7C4
交換函式swap內部 a = 2  b = 1
交換後 a = 1a的地址:000000633B0FF7A4   b = 2b的地址:000000633B0FF7C4

結果可見,函式呼叫後a、b的值並未改變,包括地址值。在函式呼叫時,在函式內部首先為a、b的地址,即為x、y開闢了新的儲存空間,並作了交換,於是函式內部a、b的值發生了互換。在函式呼叫後,x、y的儲存空間被釋放,但並不影響a、b的值

轉自C、C++的幾種引數傳遞方式(看完即懂)
C++中值傳遞和引用傳遞的區別

相關文章