C語言的call by reference === ###### tags: `C LANGUAGE` ### C語言沒有Call by reference **C只有Call by value! 能做到的僅是把位址當作value使用來進行call by value** 最簡單的呼叫如下, 傳入變數: ```clike= void foo(int *arg1){ //pointer型態的參數, 代表須傳入的是位址的copy //Function body } int main(){ int x = 0; //在Stack配置了一塊空間位址給x foo(&x); //以&取x的位址的並傳入一份copy return 0; //在Stack的空間配置由系統自動釋放 } ``` 考慮另一種寫法, 如果想要傳入**指標變數**: ```clike= void foo(int **arg1){ //pointer of pointer型態的參數, 代表須傳入的是某個pointer的位址的copy //Function body //在此function中使用時注意, *agr1才是x指到的位址 } int main(){ int *x = malloc(sizeof(int)); //在Heap配置了一塊空間位址, 並由pointer x指向之 foo(&x); // 取此pointer的位址(視為另一個指向此位址的pointer, 所謂pointer of pointer)並傳入一份copy free(x); // Heap上的變數須由人工釋放 return 0; } ``` --- ![圖解](https://i.imgur.com/sMhQxwv.jpg) **思路與結論 : 不論"一般變數"或是"指標變數", 想要達到傳入地址的效果時(當然不是真正的call by reference, 前面有提過), 都是對其用&** 也因此C沒有以下函數寫法, C++或是其他語言才有: ```clike= void foo(int &arg1){ //Function body } ```