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、可變參數必須順序通路,無法直接通路中間的參數值