1. 程式人生 > 其它 >重寫的引數是形參還是實參_C++向函式傳遞引數的三種方式:傳值、指標、引用...

重寫的引數是形參還是實參_C++向函式傳遞引數的三種方式:傳值、指標、引用...

技術標籤:重寫的引數是形參還是實參

C++中,向函式傳遞引數有三種方式:

  • 傳值呼叫 function call by value
  • 指標呼叫 function call by pointer
  • 引用呼叫 function call by reference

1、傳值呼叫

向函式傳遞引數的值,即把引數的值複製給函式的形式引數。

這種情況下,修改函式內的形式引數,並不會影響到函式外的實際引數。

#include <iostream>
using namespace std;

void swap_by_value(int x, int y) {
    int tmp = x;
    x = y;
    y = tmp;
    cout << "&x: " << &x << ", &y: " << &y << endl;
}

int main()
{
    int a = 3;
    int b = 7;

    cout << "before: a: " << a << ", b: " << b << endl;
    cout << "&a: " << &a << ", &b: " << &b << endl;
    swap_by_value(a, b);
    cout << "after : a: " << a << ", b: " << b << endl;

    return 0;
}

執行結果如下圖所示,由於形參是實參的拷貝,形參和實參的地址是不同的。因此改變形參的值,並不會影響外部實參的值。

22e23b486af1e6b2ff2ff9c8188a0a93.png

當只在函式內部改變引數,且不希望這個改變影響外部引數時,採用值傳遞。

2、指標呼叫

向函式傳遞引數的指標,即把引數的地址複製給形式引數。

在函式內,該地址用於訪問要用到的實際引數,這意味著修改形式引數會影響實際引數。

#include <iostream>
using namespace std;

void swap_by_pointer(int* x, int* y) {
    int tmp = *x;
    *x = *y;
    *y = tmp;
    cout << "&x: " << x << ", &y: " << y << endl;
}

int main()
{
    int a = 3;
    int b = 7;

    cout << "before: a: " << a << ", b: " << b << endl;
    cout << "&a: " << &a << ", &b: " << &b << endl;
    swap_by_pointer(&a, &b);
    cout << "after : a: " << a << ", b: " << b << endl;

    return 0;
}

執行結果如下圖所示,形參為指向實參地址的指標,因此對形參的指向操作,就相當於對實參本身進行操作。

55b12ea1ecb84d7be4847c311690f14f.png

3、引用呼叫

向函式傳遞引數的引用,即把引用的地址複製給形式引數。

在函式內,該引用用於訪問要用到的實際引數,這也意味著修改形式引數會影響實際引數。

#include <iostream>
using namespace std;

void swap_by_reference(int& x, int& y) {
    int tmp = x;
    x = y;
    y = tmp;
    cout << "&x: " << &x << ", &y: " << &y << endl;
}

int main()
{
    int a = 3;
    int b = 7;

    cout << "before: a: " << a << ", b: " << b << endl;
    cout << "&a: " << &a << ", &b: " << &b << endl;
    swap_by_reference(a, b);
    cout << "after : a: " << a << ", b: " << b << endl;

    return 0;
}

執行結果如下圖所示,形參相當於是實參的“別名”,兩者的地址是相同的,因此對形參的操作其實就是對實參的操作。

b0215133b7ad62ba4b6a446f7b93d5bf.png

指標傳遞和引用傳遞常用於當一個函式實際需要返回多個值時,可以將需要返回的變數以指標或引用的方式傳遞給函式。