C語言通過值和引用函數

將參數值或數據傳遞給C語言函數有兩種方法:通過值調用和通過引用調用。原始值在通過值調用時不修改,但通過引用調用時,在函數中可進行修改。

下麵將分別講解如何通過值調用和通過引用調用,並用使用示例逐個調用演示執行。

通過值調用

在通過值調用函數時,原始值不被修改。

在通過值調用時,傳遞給函數的值由函數參數在堆疊記憶體位置中本地存儲。如果更改函數參數的值,則僅對當前調用函數中的值進行臨時更改。它不會改變調用者方法(如:main())中的變數的值。即:函數只是使用參數值的一個副本,函數執行完成副本刪除,而原始值不會有任何影響。

我們試著通過下麵的例子來瞭解C語言中的通過值調用的概念,首先創建一個工程:function-call-by-value-reference,並在這個工程下創建一個原始檔案:call-by-value.c,其代碼如下所示-

#include <stdio.h>

void change(int num) {
    printf("Before adding value inside function num=%d \n", num);
    num = num + 10;
    printf("After adding value inside function num=%d \n", num);
}

int main() {
    int x = 10;
    // 更新之前參數x的值

    printf("Before function call x=%d \n", x);
    change(x); // passing value in function
    // 更新之後參數x的值

    printf("After function call x=%d \n", x);

    return 0;
}

執行上面示例代碼,得到以下結果 -

Before function call x=10
Before adding value inside function num=10
After adding value inside function num=20
After function call x=10

通過引用調用

在通過引用的調用中,原始值可被修改並反映到外部調用者。

這裏,使用值的地址傳遞到函數中,所以實際和形式的參數共用相同的地址空間。 因此,函數內部的值被改變,都會反映在函數內部和外部,因為函數內部和外部此時都指向參數的地址空間。

注意:要瞭解通過引用調用,您必須具有指針的基本知識。

讓我們通過下麵的例子來嘗試理解C語言中通過引用調用的概念,創建一個原始檔案:call-by-reference.c,其代碼如下所示-

#include <stdio.h>

// 定義函數,注意這裏的參數名稱前加了一個星號(*)
void change2(int *num) {
    printf("Before adding value inside function num=%d \n", *num);
    (*num) += 100;
    printf("After adding value inside function num=%d \n", *num);
}

int main() {
    int x = 200;

    printf("Before function call x=%d \n", x);
    // 注意,下麵傳遞的參數名稱前加了一個符號(&)
    change2(&x);// passing reference in function
    printf("After function call x=%d \n", x);

    return 0;
}

執行上面示例代碼,得到以下結果 -

Before function call x=200
Before adding value inside function num=200
After adding value inside function num=300
After function call x=300

C語言中通過值調用和通過引用調用之間的差異

通過值調用 通過引用調用
將值的副本傳遞給函數 將值的地址傳遞給函數
函數內的更改不會反映在函數外 函數內部的改變也反映在函數的外部
將在不同的記憶體位置創建實際和正式的參數 將在相同的記憶體位置創建實際和正式的參數

上一篇: C語言函數 下一篇: C語言遞歸