C語言基礎:不定參數

在這一節里我們來學習C語言中另外一個重要的機制,不定參數。不定參數是指函數可以接收不確定個數的參數,不定參數用...來表示,它必須要寫在正常參數表的後面,例如我們熟知的printf函數:

int printf (char *fmt, ...);

printf的第一個參數為char* fmt,後面則是不定參數。它表示可以接收任意個數的參數。我們在調用這樣的函數時可以向其傳與任意個數的參數,例如:

printf("%d %d
", 1, 2);printf("%f %f %f
", 1.2, 2.3, 3.4);printf("%d %f %c %s
", 1, 2.3, A, "Hello World!");

那麼,我們不禁要問,定義了一個不定參數的函數,在函數體內如何確定其形參呢?如何取得傳入參數的值呢?

C語言中提供了一種可以獲取不定參數的辦法,就是用std_arg

先來看看std_arg的使用例子:

#include <stdio.h>#include <stdarg.h>int sum(int first, ...){ va_list arg_list; int sum = first; va_start(arg_list, first); int var2 = va_arg(arg_list, int); int var3 = va_arg(arg_list, int); int var4 = va_arg(arg_list, int); int var5 = va_arg(arg_list, int); sum += var2; sum += var3; sum += var4; sum += var5; va_end(arg_list); return sum;}int main(int argc, char *argv[]){ printf("%d
", sum(1, 2, 3, 4, 5)); return 0;}

首先,我們要使用#include <stdarg.h>來包含這個使用否定參數的頭文件。然後定義一個int類型的變數,我們需要使用va_start將函數的第一個參數傳遞給arg_list,這樣它都才會知道其後面的不定參數。接下來使用va_arg來取得第二個參數值,在取值時需要將其強制轉化為指定類型的變數。在這裡我們是認為參數的類型均為int型,而通常來說我們可以向printf這樣,將第一個參數做為後續不定參數的類型定義,通過分析fmt字元串中的類型來確定後續不定參數的類型。接下來我們通過va_arg再取得第三個參數、第四個參數和第五個參數。最後使用va_end結束不定參數的使用。

當然,在定義函數和調用函數時我們都必須清楚函數的所有的參數類型,否則arglist將不能正常工作。

關於arglist的原理有興趣的讀者請參見《函數棧幀》。

歡迎關注公眾號:編程外星人


推薦閱讀:

TAG:編程 | C編程語言 |