天天看點

【C語言進階剖析】45、C語言中的可變參數

1 可變參數

2 執行個體分析

3 小結

我們都用過 printf() 函數,函數的參數個數是不确定的,第一個參數一定是字元串。這種可變參數是如何實作的呢,我們今天就來學習下。

首先,要實作可變參數必須依賴于頭檔案 stdarg.h。

其次,實作函數可變參數需要使用以下幾個标示符:

va_list:參數集合

va_arg:取具體參數值

va_start:辨別參數通路的開始

va_end:辨別參數通路的結束

看了上面幾個标示符完全不知道怎麼用,沒關系,下面通過一個例子講解,就會明白。

編寫一個函數求 n 個數的平均值,将這 n 個數直接作為參數傳遞給函數。

先看一下可變參數的限制:

可變參數必須從頭到尾按照順序逐個通路

參數清單中至少要存在一個确定的命名參數

可變參數函數無法确定實際存在的參數的數量

可變參數函數無法确定參數的實際類型

再來解讀一下上面的代碼:

1)參數清單中至少有一個确定的命名參數,這裡的确定的參數是數字的數量,也就是 int 型的 n。類似的,printf() 函數中第一個參數永遠是字元串,字元串中的 %d,%f,%p 等的數量用來确定有幾個參數。

2)可變參數函數無法确定參數的實際類型,是以在取具體參數時使用 va_arg(args, int) 來确定參數為 int,在 printf 函數中使用 %d,%f,%s 等也是用來确定參數的類型。

注意:va_arg 中如果指定了錯誤的類型,那麼結果時不可預測的。同樣的在 printf() 函數中如果将%p 寫成了 %d 得到的結果也是錯誤的。

1、可變參數的函數提供了一種更友善的函數調用方式

2、可變參數必須順序通路,無法直接通路中間的參數值