剛開始學習C語言或C++的時候,最常碰到的問題就是傳值,是使用call by value 呢 ? 還是 call by address (call by pointer)或者call by reference,究竟我要在哪個時機點使用他們,哪個效率會比較好,小弟我都會在這篇簡單的講解一下,順便喚醒大學時的記憶吧QQ

 

Call by value

使用方法 : 

int main() {
    int a = 1 ;
    int b = a ; //將a的值複製到b的新記憶體區域

    return 0;
}

 

結果 : 

a的值仍然是1, 而a的值複製到了b的記憶體區域, 所以b現在的值也是1。

 

注意事項 :

當你利用call by value的方法去傳值時因為a與b的記憶體是分開的,所以不會互相干擾,但也需要兩個記憶體去儲存他們,這時候請仔細思考是否有使用call by value的必要,如果之後在較大型的程式運行時,若使用太多call by value而使用結束後沒有刪除掉未使用的記憶體空間,可能會導致記憶體不足而程式崩潰,切記切記!

 

Call by address (Call by pointer)

使用方法 : 

void swap(int *address_a, int *address_b) {
    int temp = *address_a ; 
    *address_a = *address_b;
    *address_b = temp;
}

int main() {

    int a = 1;
    int b = 0;

   cout<< a << " " << b << endl; // 1 0

    swap(&a, &b); // 傳入a, b的address進行交換

    cout<< a << " " << b << endl; // 0 1

    return 0;
}

 

結果 : 

在這個例子中,使用了一個swap function,它的功能是將a和b傳入的address進行交換,之後在main裡面利用&符號傳入address,然後執行一遍就可以發現,交換前a的值為1,b的值為0,交換後a的記憶體空間和b交換,所以各自代表的值也變成了0和1。

 

注意事項 : 

當你使用call by address時,經常會使用到pointer,想當年當接觸C, C++的我對於pointer(指標)也是一知半解,符號*和&的用法除了知道理論外動手實際去做一遍才能熟能生巧,之後介紹一篇pointer的教學吧

 

Call by reference

使用方法 : 

void swap(int &address_a, int &address_b) {
    int temp = address_a ; 
    address_a = address_b;
    address_b = temp;
}

int main() {

    int a = 1;
    int b = 0;

   cout<< a << " " << b << endl; // 1 0

    swap(a, b); // 傳入a, b的address進行交換

    cout<< a << " " << b << endl; // 0 1

    return 0;
}

 

結果 : 

看起來是不是和call by address很像呢,其實他也是利用pointer的方法實作,只是更簡潔,但這個方法只能在C++上使用,所以寫C的朋友們將就點使用call by address吧 ! 





arrow
arrow
    創作者介紹

    橘子亂說話 發表在 痞客邦 留言(3) 人氣()