[C] pass-by-value & pass-by-reference 傳值 & 傳參考(傳址)

Intro

pass-by-valuepass-by-reference 有點像是,
今天你要抄別人的作業,
一個是別人把答案念給你,你在寫,
另一個是直接把考卷拿過來抄,

就以抄作業來說,
只是知道作業的答案,
用聽的 和 直接拿過來抄好像沒什麼區別,
但如過你是直接拿到別人的作業的話,
你就可以更動別人的作業了 (恩.. 好像蠻怪的

總之,
在 function 中,
pass-by-value 拿到的是變量的副本,
pass-by-reference 拿到的是變量本身,

順帶一提,
在 C 中,
所有的 pass-by-reference 都是通過 pointer 來完成的

使用 pass-by-reference 的時機

1. 當你需要對傳入參數進行操作的時候

#include <stdio.h>

struct AStructureOfData
{
    int status = 0;
} s1;

void function1(AStructureOfData* data)
{
    data->status = 1;
}

int main()
{
    print("s1 status: %d\n", s1->status); // print 0
    function1(&s1); // change status to 1
    print("s1 status: $d\n", s1->status); // print 1
    return 0;
}

2. 複雜的結構

如果 structpass-by-value 的話,
編譯器畫把結構中的每個資料都複製一次,
這樣會造成程式變得很沒有效率,
但如果是 pass-by-reference
就可以直接存取原有結構,
省去不必要的複製。

struct AStructureOfData
{
    int a;
    int b;
    int c;
    int d;
    int e;
    // or more vars
};

void function1(AStructureOfData* data)
{
    // do something here
}

不過有很多語言,
都是用 pass-by-reference
像是 Java 。
(但是嚴格的來說 Java ,其實他沒有 pass-by-reference

Show Comments