HOME ABOUT CONTACT

C/C++教學: 第十六課 - 傳值呼叫、傳址呼叫、傳參呼叫

Rain September 7, 2024
Outline

1. 簡介

2. 傳值呼叫

3. 傳址呼叫

4. 傳參呼叫

簡介top

本篇要來理解一些綜合了函式和指標的概念,讓我們的函式設計可以更加的靈活和實用。這些概念分別稱之為傳值呼叫(Call by Value)傳址呼叫(Call by Address)傳參呼叫(Call by Reference),三者所指的是函式的參數型態。

傳值呼叫top

我們在理解函式的文章中(第十三課 - 函式),所運用的例子即是傳值呼叫(Call by Value),回顧下面語法:


int add (int a, int b) {
    return a+b;
}
                        

它所指的是函式參數以複製資料的方式給函式去做處理計算,既然是複製的變數,它就意味著不會影響原本的變數值。如下例:


void func (int a) {
    a++;
}

int main (int argc, char* argv[]) {
    int a = 0;
    func(a);
    std::cout << "a = " << a << std::endl;
}
                        

上面的例子中,假設我們設計了一函式 func ,並且對變數 a 去做 +1 的動作,但是回到 main 函式後,你會發現變數 a 並沒有任何變動, 它還是維持原本的值 0 。當然我們可以將函式設計成回傳整數型態的函式,並且將計算結果傳回來給原本的變數 a 去接收,這樣就可以達到我們原本的目的。 但是除此之外,就沒有其他方法了嗎? 假設我想設計的函式回傳值不只一個呢? 接下來我們就要來理解傳址呼叫(Call by Address)和傳參呼叫(Call by Reference)了。

傳址呼叫top

傳址呼叫(Call by Address)主要是運用我們剛學會的指標概念,讓函式的參數可以用指標的型態來傳遞給函式去做處理計算,承如上面的例子, 假設我們想設計一個不回傳任何值的函式,但會變更原本變數 a 值的函式,該如何撰寫呢? 如下例:


void func (int *a) {
    (*a)++; // 記得使用取值符號,若沒有取值符號,會代表另一個意思
}

int main (int argc, char* argv[]) {
    int a = 0;
    func(&a); // 記得使用取址符號
    std::cout << "a = " << a << std::endl;
}
                        

我們可以將函式 func 的參數改為整數指標型態,並且記得要用取值符號對變數 a 進行 +1 的動作,另外也要記得在傳遞變數 a 給函式處理時, 也要用取址符號將變數 a 的位址取出傳遞給函式。

這個原理是指函式會有一份整數指標型態的參數,用以指向某個被指定的變數位址,來供函式內部處理計算。在設計實作上, 這樣的方式通常會是用以指向某個結構或是類別,鮮少會單純地用以指向某個變數,若要單指變數的話,常用的會是傳參呼叫(Call by Reference)。

傳參呼叫top

我們只要將傳址呼叫(Call by Reference)的概念轉向一下,便可以理解傳參呼叫(Call by Address)的原理。 假設我們要用傳參呼叫來設計和上述一樣的函式,可以看看下面的例子:


void func (int &a) {
    a++; // 不用取值符號
}

int main (int argc, char* argv[]) {
    int a = 0;
    func(a); // 不用取址符號
    std::cout << "a = " << a << std::endl;
}
                        

我們只要將函式的參數型態改為取整數變數的位址,一樣也可以直接得到變數 a 的位址,並且不用取值符號,就可直接地對變數 a 進行 +1 的動作。 除此之外,在將變數 a 傳遞給函式時,也不需要取址符號,因為函式會自動地去取變數的位址來做處理計算。

這個方式除了省去了取值和取址符號,也能省去複製資料給函式時,所多占用的記憶體容量,因為函式是直接對該記憶體位址的變數進行處理計算, 而非又複製了一份一樣的資料給函式。

下一篇: 第十七課 - 陣列(Array)

Last updated:

Related Artical List

  1. C/C++教學: 第十四課 - 函式(Function) part2
  2. C/C++教學: 第十五課 - 指標(Pointer)
  3. C/C++教學: 第十七課 - 陣列(Array)

Article List