提到變參函數(shù),我們的感覺是不是既熟悉又陌生?感覺熟悉是因為我們平時都在使用著,如我們常使用的printf()函數(shù)與scanf()函數(shù)就是典型的變參函數(shù)。因為printf()函數(shù)是變參函數(shù)我們才可以根據(jù)我們的需要靈活地輸出變量的值。如:
printf("hi"); //給printf函數(shù)傳入1個參數(shù)
printf("%d\n",a); //給printf函數(shù)傳入2個參數(shù)
printf("%s %d", str, a); //給printf函數(shù)傳入3個參數(shù)
...
... //給printf函數(shù)傳入n個參數(shù)
我們可以根據(jù)需要給printf()函數(shù)傳入n個參數(shù),這就是變參函數(shù)。
感覺陌生是因為我們沒有試著創(chuàng)建變參函數(shù)。要創(chuàng)建變參函數(shù)需要包含頭文件stdarg.h,并且創(chuàng)建變參函數(shù)應(yīng)按照如下步驟進行:
【第一步】定義一個使用省略號的函數(shù)原型,如printf()與scanf()函數(shù)的原型為
int printf (const char *__format, ...)
int scanf (const char*, ...);
【第二步】在函數(shù)定義中創(chuàng)建一個va_list類型的變量,用于存儲不定的參數(shù);
【第三步】用宏va_start把該變量初始化為一個參數(shù)列表;
【第四步】用宏va_arg訪問參數(shù)列表;
【第五步】用宏va_end完成清理工作。
示例程序:
#include <stdio.h>
#include <stdarg.h>
/*【第一步】:定義一個使用省略號的函數(shù)原型 */
double sum(int lim, ...)
{
/*【第二步】:聲明一個va_list類型的變量ap */
va_list ap;
double sum = 0; // 用于保存參數(shù)之和
int i;
/*【第三步】:使用va_start把變量ap初始化為參數(shù)列表 */
va_start(ap, lim);
for (i = 0; i < lim; i++)
{
/*【第四步】: 使用va_arg訪問參數(shù)列表。
這里第二個參數(shù)是double類型,傳入的不定參數(shù)就應(yīng)是double類型
*/
sum += va_arg(ap, double);
}
/*【第五步】:使用va_end完成清理工作 */
va_end(ap);
return sum;
}
int main(void)
{
double sum1 = 0, sum2 = 0;
/* 計算 */
sum1 = sum(3, 1.1, 2.2, 3.3);
sum2 = sum(6, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0);
printf("sum1 = %f\n", sum1);
printf("sum2 = %f\n", sum2);
return 0;
}
變參函數(shù)sum()用于求lim個數(shù)之和,并且這lim個數(shù)的類型必須是double類型,因為sum函數(shù)實體中使用va_arg訪問參數(shù)列表中的參數(shù)類型為double類型。
程序輸出結(jié)果為:
以上就是關(guān)于可變參數(shù)的一點小總結(jié),如有錯誤歡迎指出。
關(guān)注我的微信公眾號【嵌入式大雜燴】,回復(fù):C語言,可獲取C語言資料。
關(guān)注我的個人博客【我的博客】查看更多筆記
