找漫畫店 撰寫於文章 <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 使用上密不可分.