【C語言學習】如何創(chuàng)建變參函數(shù)?

提到變參函數(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)注我的個人博客【我的博客】查看更多筆記

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容