
- 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 - 返回語句
- 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 - 列舉(或列舉型別)
- 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語言中強大但很少使用的特性之一。變參函式在程式設計應用程式結構方面增加了很大的靈活性。
C語言中的變參函式
可以接受可變數量引數的函式稱為變參函式。定義變參函式需要一個固定引數。
C語言中最常用的庫函式,即printf()和scanf()實際上是變參函式最著名的例子,因為我們可以在格式說明符字串之後放置可變數量的引數。
printf("format specifier",arg1, arg2, arg3, . . .);
變參函式的語法
在C語言中,變參函式被定義為至少有一個固定引數,然後後跟省略號(...),這使得編譯器能夠解析可變數量的引數。
return_type function_name(type arg1, ...);
您需要在程式碼頂部包含stdarg.h標頭檔案來處理可變引數。此標頭檔案提供以下宏來處理省略號符號接收到的引數。
方法 | 描述 |
---|---|
va_start(va_list ap, arg) | 最後一個固定引數後的引數儲存在va_list中。 |
va_arg(va_list ap, type) | 每次獲取可變引數列表va_list中的下一個引數,並將其轉換為給定的型別,直到到達列表的末尾。 |
va_copy(va_list dest, va_list src) | 這會建立va_list中引數的副本。 |
va_end(va_list ap) | 這將結束對變參函式引數的遍歷。當到達va_list的末尾時,列表物件將被清理。 |
C語言中變參函式的示例
示例:使用變參函式求數字之和
以下程式碼使用變參函式的概念來返回傳遞給此函式的可變數量的數字引數的總和。addition()函式的第一個引數是其餘引數的數量。
在addition()函式內部,我們如下初始化va_list變數:
va_list args; va_start (args, n);
由於後面有“n”個引數,因此使用“va_arg()”宏獲取“n”次的下一個引數並執行累加:
for(i = 0; i < n; i++){ sum += va_arg (args, int); }
最後,清理va_list變數:
va_end (args);
函式透過返回所有引數的總和結束。
完整的程式碼如下:
#include <stdio.h> #include <stdarg.h> // Variadic function to add numbers int addition(int n, ...){ va_list args; int i, sum = 0; va_start (args, n); for (i = 0; i < n; i++){ sum += va_arg (args, int); } va_end (args); return sum; } int main(){ printf("Sum = %d ", addition(5, 1, 2, 3, 4, 5)); return 0; }
輸出
執行程式碼並檢查其輸出:
Sum = 15
您可以嘗試向addition()函式提供不同的數字集作為變參。
示例:使用變參函式查詢最大數
我們可以擴充套件變參函式的概念來查詢給定可變數量值的列表中的最大數。
#include <stdio.h> #include <stdarg.h> // Variadic function to add numbers int largest(int n, ...){ va_list args; int i, max = 0; va_start (args, n); for(i = 0; i < n; i++){ int x = va_arg (args, int); if (x >= max) max = x; } va_end (args); return max; } int main(){ printf("Largest number in the list = %d ", largest(5, 12, 34, 21, 45, 32)); return 0; }
輸出
執行此程式碼時,將產生以下輸出:
Largest number in the list = 45
示例:使用變參函式連線多個字串
在以下程式碼中,我們將多個字串傳遞給一個變參函式,該函式返回一個連線後的字串。
#include <stdio.h> #include <string.h> #include <stdarg.h> char * concat(int n, ...){ va_list args; int i; static char string[100], *word; va_start (args, n); strcpy(string, ""); for (i = 0; i < n; i++){ word= va_arg (args, char *); strcat(string, word); strcat(string, " "); } va_end (args); return string; } int main(){ char * string1 = concat(2, "Hello", "World"); printf("%s\n", string1); char * string2 = concat(3, "How", "are", "you?"); printf("%s\n", string2); return 0; }
輸出
執行程式碼並檢查其輸出:
Hello World How are you?
廣告