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
#include
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 來包含這個使用否定參數的頭文件。然後定義一個int類型的變數,我們需要使用va_start將函數的第一個參數傳遞給arg_list,這樣它都才會知道其後面的不定參數。接下來使用va_arg來取得第二個參數值,在取值時需要將其強制轉化為指定類型的變數。在這裡我們是認為參數的類型均為int型,而通常來說我們可以向printf這樣,將第一個參數做為後續不定參數的類型定義,通過分析fmt字元串中的類型來確定後續不定參數的類型。接下來我們通過va_arg再取得第三個參數、第四個參數和第五個參數。最後使用va_end結束不定參數的使用。
當然,在定義函數和調用函數時我們都必須清楚函數的所有的參數類型,否則arglist將不能正常工作。
關於arglist的原理有興趣的讀者請參見《函數棧幀》。
關注編程外星人
我想加入交流群
※文本分析小練手——詞頻雲圖
※ndarray的生成、屬性、索引
※為了孩子,你應該知道的兒童房設計
※王者榮耀:不改掉這些壞習慣,就別怪自己排位連輸!
TAG:全球大搜羅 |