1. 程式人生 > >C語言中的可變引數列表

C語言中的可變引數列表

還記得剛學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語言提供的一種函式設計技巧
可變引數的函式提供了一種更方便的函式呼叫方式
可變引數必須順序的訪問
無法直接訪問可變引數列表中間的引數值