精華區beta Programming 關於我們 聯絡資訊
找漫畫店 撰寫於文章 <3S4IHL$X0c@bbs.yzu.edu.tw>... > 兩個不都是傳遞「指標」,然後來更改那個指標所指到的「位址」嗎? > 還有 C language 中,為什麼要稱 call by reference 為模擬的?難 > 道這不是真正 call by reference 的方式?希望有人替我解答,謝謝! 先說明一下. call by reference 是 C++ 才有的, C 還沒有這個呼叫方式. 其實 call by reference 與 call by address 是具備相同的能力,內部的運作都是 使用指標來完成. 在 C 語言中,若是你需要更改傳入的參數值,那就需要 使用 call by address 的方式才可以辦到;而在 C++ 中,使用 call by address 與 call by reference 都可以完成相同的動作. 我們以實際寫程式來說,以常見的 swap 動作來看看: call by address : void swap(int *num1,int *num2); int main() { int a=100,b=200; swap(&a,&b); } void swap(int *num1,int *num2) { int temp = *num1; *num1=*num2; *num2=temp; } call by reference void swap(int &num1,int &num2); int main() { int a=100,b=200; swap(a,b); } void swap(int &num1,int &num2) { int temp=num1; num1=num2; num2=temp; } swap 的函式中,使用 call by reference & call by address 的寫法都可以達到 資料交換的功能. reference 參考型態除了具備此功能外,當然還有其他的應用. 比方在函式中的參數需要傳入大量的 struct 資料,編譯器的做法 是使用 push stack 的方式來處理.不過這有個缺點,當 push stack 的 資料量很多的話,這便造成 stack overflow 的情形. struct mydata { char name[20]; char address[100]; int ID[15]; int telephone[30]; ...... }; void getdata(struct mydata p); int main() { getdata(data); } // call by value) 若是改用 call by address 可避免 stack overflow 的問題 : struct mydata { char name[20]; char address[100]; int ID[15]; int telephone[30]; ...... }; void getdata(struct mydata *p); int main() { getdata(&data); } // call by address 不過實際在 getdata() 函式內部區用 mydata 還必須使用 (*x).xxx 的方式取用: void getdata(struct mydata *p) { strcpy(name,p->name); ... } 若是改用 call by reference 就變得很方便,也不會有 call by value 的缺點: void getdata(struct mydata &p); int main() { getdata(data); } // call by reference void getdata(struct mydata &p) { strcpy(name,p.name); .... } 當然, 使用 reference 的方式還有其他用途,比方 reference 可以當作 return 的型態,所以與 class 使用上密不可分.