C語言中的可變引數列表
阿新 • • 發佈:2018-12-31
還記得剛學C語言時,第一個程式就是使用printf列印“hello world!”,當時覺得很神奇,後來慢慢覺得是最簡單的,可漸漸熟悉之後發現,我們寫的函式的引數都是固定的,而發現printf的引數居然是不定的,不知道有沒有去研究過這個問題呢。其實這就是C語言中可變引數的功能。
可變引數
C語言中可以定義引數可變的函式
引數可變函式的實現依賴於stdarg.h標頭檔案
va_list變數與va_start, va_end和va_arg配合使用能夠訪問引數值
來看各例子比較清楚:
問題
如何編寫一個可以計算n個數平均值的函式?
我們使用可變引數來寫這個函式:
#include <stdio.h> #include <stdarg.h> float average(int n, ...) //可變引數 { va_list args; //va_list int i = 0; float sum = 0; va_start(args, n); //var_start for(i=0; i<n; i++) { sum += va_arg(args, int); //var_arg } va_end(args); //var_end return sum / n; } int main() { printf("%f\n", average(5, 1, 2, 3, 4, 5)); printf("%f\n", average(4, 1, 2, 3, 4)); return 0; }
可變引數的限制
可變引數必須從頭到尾按照順序逐個訪問
引數列表中至少要存在一個確定的命名引數
可變引數巨集無法判斷實際存在的引數的數量
可變引數巨集無法判斷引數的實際型別
警告:
va_arg中如果指定了錯誤的型別,那麼結果是不可預測的。
小結
可變引數是C語言提供的一種函式設計技巧
可變引數的函式提供了一種更方便的函式呼叫方式
可變引數必須順序的訪問
無法直接訪問可變引數列表中間的引數值