【C】函數參數的祕密(下)

調用約定

當函數調用發生時
參數會傳遞給被調用的函數
而返回值會被返回給函數調用者
調用約定描述參數如何傳遞到棧中以及棧的維護方式
參數傳遞順序
調用棧清理
調用約定是預約義可理解爲調用協議
調用約定一般用於庫調用和庫開發的時候

例子45-1:函數

#include <stdio.h>
float average(int array1[],int size)
{
    int i = 0;
    float avr = 0;
    for(i = 0;i < size; i ++)
    {
        avr += array1[i];
    }
    return avr/size;
}
int main()
{
    int array1[] = {1,2,3,4,5};
    printf("%f\n",average(array1,5));
}

輸出結果:設計

3.000000

可變參數

C語言中能夠定義參數可變的函數
參數可變函數的實現依賴於stdarg.h頭文件
va_list-參數集合
va_arg-取具體參數值
va_start-表示參數訪問的開始
va-end-標識參數訪問的結束
例子45-2:code

#include <stdio.h>
#include "stdarg.h"
float average(int n,...)
{
    va_list args; //可變參數集合
    int i = 0;
    float sum = 0;
    va_start(args,n);  //可變參數訪問開始
    for(i = 0;i < n; i ++)
    {
        sum += va_arg(args,int);  //從va_arg取具體參數值,取n個
    }
    va_end(args);//參數已經取完了
    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;
}

輸出結果:開發

3.000000
2.500000

可變參數的限制

可變參數必須從頭至尾按照順序逐個訪問
參數列表中至少要存在一個肯定的命名參數
可變參數函數沒法肯定實際存在的參數的數量
可變參數函數沒法肯定參數的實際類型

小結:

調用約定指定了函數參數的入棧順序以及棧的清理方式
可變參數是C語言提供的一種函數設計技巧
可變參數的函數提供了一種更方便的函數調用方式
可變參數必須順序的訪問,沒法直接訪問中間的參數值
相關文章
相關標籤/搜索