
- C程式設計教程
- C語言 - 首頁
- C語言基礎
- C語言 - 概述
- C語言 - 特性
- C語言 - 歷史
- C語言 - 環境搭建
- C語言 - 程式結構
- C語言 - Hello World
- C語言 - 編譯過程
- C語言 - 註釋
- C語言 - 詞法單元
- C語言 - 關鍵字
- C語言 - 識別符號
- C語言 - 使用者輸入
- C語言 - 基本語法
- C語言 - 資料型別
- C語言 - 變數
- C語言 - 整數提升
- C語言 - 型別轉換
- C語言 - 型別強制轉換
- C語言 - 布林值
- C語言中的常量和字面量
- C語言 - 常量
- C語言 - 字面量
- C語言 - 轉義序列
- C語言 - 格式說明符
- C語言中的運算子
- C語言 - 運算子
- C語言 - 算術運算子
- C語言 - 關係運算符
- C語言 - 邏輯運算子
- C語言 - 位運算子
- C語言 - 賦值運算子
- C語言 - 一元運算子
- C語言 - 自增和自減運算子
- C語言 - 三元運算子
- C語言 - sizeof 運算子
- C語言 - 運算子優先順序
- C語言 - 其他運算子
- C語言中的決策
- C語言 - 決策
- C語言 - if 語句
- C語言 - if...else 語句
- C語言 - 巢狀 if 語句
- C語言 - switch 語句
- C語言 - 巢狀 switch 語句
- C語言中的迴圈
- C語言 - 迴圈
- C語言 - while 迴圈
- C語言 - for 迴圈
- C語言 - do...while 迴圈
- C語言 - 巢狀迴圈
- C語言 - 死迴圈
- C語言 - break 語句
- C語言 - continue 語句
- C語言 - goto 語句
- C語言中的函式
- C語言 - 函式
- C語言 - 主函式
- C語言 - 值傳遞函式呼叫
- C語言 - 引用傳遞函式呼叫
- C語言 - 巢狀函式
- C語言 - 變參函式
- C語言 - 使用者自定義函式
- C語言 - 回撥函式
- C語言 - return 語句
- C語言 - 遞迴
- C語言中的作用域規則
- C語言 - 作用域規則
- C語言 - 靜態變數
- C語言 - 全域性變數
- C語言中的陣列
- C語言 - 陣列
- C語言 - 陣列的特性
- C語言 - 多維陣列
- C語言 - 將陣列傳遞給函式
- C語言 - 從函式返回陣列
- C語言 - 變長陣列
- C語言中的指標
- C語言 - 指標
- C語言 - 指標和陣列
- C語言 - 指標的應用
- C語言 - 指標運算
- C語言 - 指標陣列
- C語言 - 指向指標的指標
- C語言 - 將指標傳遞給函式
- C語言 - 從函式返回指標
- C語言 - 函式指標
- C語言 - 指向陣列的指標
- C語言 - 指向結構體的指標
- C語言 - 指標鏈
- C語言 - 指標與陣列的區別
- C語言 - 字元指標和函式
- C語言 - 空指標
- C語言 - void 指標
- C語言 - 野指標
- C語言 - 解引用指標
- C語言 - 近指標、遠指標和巨指標
- C語言 - 指標陣列的初始化
- C語言 - 指標與多維陣列的區別
- C語言中的字串
- C語言 - 字串
- C語言 - 字串陣列
- C語言 - 特殊字元
- C語言結構體和聯合體
- C語言 - 結構體
- C語言 - 結構體和函式
- C語言 - 結構體陣列
- C語言 - 自引用結構體
- C語言 - 查詢表
- C語言 - 點(.)運算子
- C語言 - 列舉(enum)
- C語言 - 結構體填充和壓縮
- C語言 - 巢狀結構體
- C語言 - 匿名結構體和聯合體
- C語言 - 聯合體
- C語言 - 位域
- C語言 - typedef
- C語言中的檔案處理
- C語言 - 輸入輸出
- C語言 - 檔案I/O (檔案處理)
- C語言預處理器
- C語言 - 預處理器
- C語言 - 編譯指示
- C語言 - 預處理器運算子
- C語言 - 宏
- C語言 - 標頭檔案
- C語言中的記憶體管理
- C語言 - 記憶體管理
- C語言 - 記憶體地址
- C語言 - 儲存類別
- 其他主題
- C語言 - 錯誤處理
- C語言 - 可變引數
- C語言 - 命令執行
- C語言 - 數學函式
- C語言 - static 關鍵字
- C語言 - 隨機數生成
- C語言 - 命令列引數
- C語言程式設計資源
- C語言 - 問答
- C語言 - 快速指南
- C語言 - 速查表
- C語言 - 有用資源
- C語言 - 討論
C語言值傳遞函式呼叫
在C語言中,一個函式可以從任何其他函式(包括自身)呼叫。函式呼叫有兩種方式:(a)值傳遞和(b)引用傳遞。預設情況下,使用值傳遞機制。
形式引數和實際引數
您必須瞭解這些術語才能理解值傳遞方法的工作原理:
形式引數 - 函式需要某些資料來執行其所需的過程。定義函式時,假設資料值將以引數或引數列表的形式提供,該列表位於函式名前面的括號內。這些引數是某種資料型別的變數。
實際引數 - 當要呼叫某個函式時,應為其提供相同型別且順序相同的所需數量的值,就像在其定義中使用的那樣。
看看下面的程式碼片段:
type function_name(type var1, type var2, ...)
這裡,引數變數稱為形式引數。在函式的作用域內,這些變數充當其區域性變數。
考慮以下函式:
int add(int x, int y){ int z = x + y; return z; }
此函式定義中的引數x和y是形式引數。
示例:C語言中的值傳遞
如果呼叫add()函式,如下面的程式碼所示,則括號內的變數(a和b)是實際引數。它們被傳遞給函式。
請看下面的例子:
#include <stdio.h> int add(int x, int y){ int z = x + y; return z; } int main(){ int a = 10, b = 20; int c = add(a, b); printf("Addition: %d", c); }
輸出
執行此程式碼後,將產生以下輸出:
Addition: 30
值傳遞方法意味著實際引數的值被複制到形式引數變數中。因此,“x”取“a”的值,“b”賦值給“y”。add()函式中的區域性變數“z”儲存加法值。在main()函式中,add()函式返回的值被賦值給“c”,然後打印出來。
請注意,C語言中的變數是記憶體中的命名位置。因此,變數在記憶體中建立,並且每個變數由編譯器分配一個隨機記憶體地址。
C語言中的“值傳遞”是如何工作的?
讓我們假設main()函式中的變數a、b和c分別佔據記憶體位置100、200和300。當用a和b作為實際引數呼叫add()函式時,它們的值分別儲存在x和y中。

變數x、y和z是add()函式的區域性變數。在記憶體中,它們將被分配一些隨機位置。讓我們假設它們分別在記憶體地址1000、2000和3000中建立。
由於函式是透過將實際引數的值複製到其對應的形式引數變數來呼叫的,因此x和y的地址(分別是1000和2000)將分別儲存10和20。編譯器將其和分配給第三個區域性變數z,然後返回。
當控制返回到main()函式時,返回的資料被賦值給c,並顯示為程式的輸出。
示例
值傳遞是C語言中預設的函式呼叫機制。它消除了函式的潛在副作用,使您的軟體更易於維護和理解。它最適合於預期對接收到的引數進行特定計算並返回結果的函式。
這是另一個值傳遞的例子:
#include <stdio.h> /* function declaration */ void swap(int x, int y); int main(){ /* local variable definition */ int a = 100; int b = 200; printf("Before swap, value of a: %d\n", a); printf("Before swap, value of b: %d\n", b); /* calling a function to swap the values */ swap(a, b); printf("After swap, value of a: %d\n", a); printf("After swap, value of b: %d\n", b); return 0; } void swap(int x, int y){ int temp; temp = x; /* save the value of x */ x = y; /* put y into x */ y = temp; /* put temp into y */ return; }
輸出
執行此程式碼後,將產生以下輸出:
Before swap, value of a: 100 Before swap, value of b: 200 After swap, value of a: 100 After swap, value of b: 200
它表明值沒有改變,儘管它們在函式內部發生了改變。
由於值被複制到另一個函式的不同區域性變數中,任何操作都不會影響呼叫函式中的實際引數變數。
但是,當我們需要將大型物件(如陣列或檔案)傳遞給另一個函式時,值傳遞方法效率較低。此外,在某些情況下,我們可能需要另一個函式來操作實際引數。在這種情況下,值傳遞機制不起作用。我們必須為此目的探索引用傳遞機制。請參考下一章,瞭解C語言引用傳遞機制的詳細解釋。
引用傳遞方法涉及傳遞儲存實際引數值的變數的地址。您可以設計一種呼叫方法,該方法是值傳遞和引用傳遞的混合。在這種情況下,某些引數按值傳遞,而其他引數按引用傳遞。