2014年3月12日 星期三

C 語言 函式-傳值呼叫與傳址呼叫 / C language function - pass by value and pass by address

C 語言 函式-傳值呼叫與傳址呼叫

作者:許裕永 Darban

呼叫者函式 (caller function) ->呼叫另一個函式的函式。

工作者函式 (worker function) ->被呼叫的函式。

函式呼叫敍述 ( function calls statement ) ->呼叫者函式中呼叫工作者函式的敍述。

區域變數 (local variable) ->在函式的區塊中宣告的變數,只存活在宣告的區塊中。除了本函式可以存取之外,也可以籍由傳址呼叫讓工作者函式存取

參數 (parameter / argument) ->由呼叫者函式傳遞給工作者函式的值或記憶體位址。在呼叫者函式中,指的是放在函式呼叫敍述的小括號中的值或記憶體位址;在工作者函式中,指的是宣告在小括號中的變數或指標,可以說是:「讓函式呼叫敍述指派值的區域變數」。是一個讓呼叫者函式把值或記憶體位址傳提供給工作者函式運算的管道

返回值 (return value) ->當 return type 不是 void 時, return value 是工作者函式工作完成後產生的值。在工作者函式中指的是放在 return 後的值;在呼叫者函式中,呼叫工作者函式的函式呼叫敍述,就代表返回值,所以函式呼叫敍述除了可以是獨立敍述外,也可以直接放在合法的運算式或敍述裏。是一個讓工作者函式將運算結果回饋給呼叫者函式的管道

>_< 傳值呼叫 ( pass by value )
呼叫者函式把字面值或變數儲存的值傳遞給工作者函式

Example:

void changeValue(int);
int main(int argc, char *argv[]) {
       
        int i = 10;
        changeValue(i);
        printf("The value of variable i is %d",i);
       
        return 0;
}
void changeValue(int i)
{
        i += 5;
}

宣告於 main 的變數 i 的值並沒有被 changeValue 改掉,列印的結果還是 10 。因為 main i main 的區域變數,用 i 作為參數是把變數 i 的值複製一份指派給 changeValue i 。而 changeValule i 可以視同為 changeValue 的區域變數。它的值由函式呼叫敍述指派,但它的運算和 main 中的 i 沒有關係

>_< 傳址呼叫 ( pass by address )
呼叫者函式把字面值或變數儲存的值傳遞給工作者函式


1.          pass by reference
Example:

void changeValue(int*);
int main(int argc, char *argv[]) {
       
        int i = 10;
        changeValue(&i);
        printf("The value of variable i is %d",i);
       
        return 0;
}
void changeValue(int* i_point)
{
        *i_point += 5;
}

宣告在 main 中的區域變數 i 的值,被工作者函式 changeValue 改掉了,列印的結果是 15 。因為在函式呼叫敍述中,小括號中放的是變數 i 的記憶體位址;也就是說,函式呼叫敍述把變數 i 的記憶體位址指派給 changeValue 的指標參數 i_point ,讓 changeVlue 可以透過 *i_point 存取 變數 i 的值
就好像變數 i 的自己家的地址寫給快遞公司 changeValue ,讓 changeValue 可以把商品送到 i 的家裡一樣。

2.          pass by point
Example:

void changeValue(int*);
int main(int argc, char *argv[]) {
       
        int* i_point = (int*)malloc(sizeof(int));
        *i _point= 10;
        changeValue(i_point);
        printf("The value of variable i is %d",*i);
        free(i);
       
        return 0;
}
void changeValue(int* i_point)
{
        *i_point += 5;
}

宣告在 main 中的 i_point 是一個指標,儲存著 malloc 配置的記憶體空間的記憶體位址。在函式呼叫敍述中,用 i_point 而不是用 &i_point 當參數的意思,是把 i_point 中儲存的記憶體位址複製一份並指派給 changeValue i_point ;而不是把 i_point 的記憶體位址指派給changeValue i_point
也就是說 changeValue 中的 i_point 儲存著和 main 中的 i_point 一樣的記憶體位址;所以在 changeValue 中存取的,是在 main 中透過 malloc 配置給 i_ponit 的記憶體空間,而不是 i_point

沒有留言:

張貼留言