溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

C語(yǔ)言中可變參數(shù)函數(shù)有哪些

發(fā)布時(shí)間:2021-08-26 15:44:58 來(lái)源:億速云 閱讀:166 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹C語(yǔ)言中可變參數(shù)函數(shù)有哪些,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

C語(yǔ)言可變參數(shù)函數(shù)

C 語(yǔ)言允許定義參數(shù)數(shù)量可變的函數(shù),這稱(chēng)為可變參數(shù)函數(shù)(variadic function)。這種函數(shù)需要固定數(shù)量的強(qiáng)制參數(shù)(mandatory argument),后面是數(shù)量可變的可選參數(shù)(optional argument)。

這種函數(shù)必須至少有一個(gè)強(qiáng)制參數(shù)??蛇x參數(shù)的類(lèi)型可以變化??蛇x參數(shù)的數(shù)量由強(qiáng)制參數(shù)的值決定,或由用來(lái)定義可選參數(shù)列表的特殊值決定。

C 語(yǔ)言中最常用的可變參數(shù)函數(shù)例子是 printf()和 scanf()。這兩個(gè)函數(shù)都有一個(gè)強(qiáng)制參數(shù),即格式化字符串。格式化字符串中的轉(zhuǎn)換修飾符決定了可選參數(shù)的數(shù)量和類(lèi)型。

對(duì)于每一個(gè)強(qiáng)制參數(shù)來(lái)說(shuō),函數(shù)頭部都會(huì)顯示一個(gè)適當(dāng)?shù)膮?shù),像普通函數(shù)聲明一樣。參數(shù)列表的格式是強(qiáng)制性參數(shù)在前,后面跟著一個(gè)逗號(hào)和省略號(hào)(...),這個(gè)省略號(hào)代表可選參數(shù)。

可變參數(shù)函數(shù)要獲取可選參數(shù)時(shí),必須通過(guò)一個(gè)類(lèi)型為 va_list 的對(duì)象,它包含了參數(shù)信息。這種類(lèi)型的對(duì)象也稱(chēng)為參數(shù)指針(argument pointer),它包含了棧中至少一個(gè)參數(shù)的位置??梢允褂眠@個(gè)參數(shù)指針從一個(gè)可選參數(shù)移動(dòng)到下一個(gè)可選參數(shù),由此,函數(shù)就可以獲取所有的可選參數(shù)。va_list 類(lèi)型被定義在頭文件 stdarg.h 中。

當(dāng)編寫(xiě)支持參數(shù)數(shù)量可變的函數(shù)時(shí),必須用 va_list 類(lèi)型定義參數(shù)指針,以獲取可選參數(shù)。在下面的討論中,va_list 對(duì)象被命名為 argptr??梢杂?4 個(gè)宏來(lái)處理該參數(shù)指針,這些宏都定義在頭文件 stdarg.h 中:

void va_start(va_list argptr, lastparam);

宏 va_start 使用第一個(gè)可選參數(shù)的位置來(lái)初始化 argptr 參數(shù)指針。該宏的第二個(gè)參數(shù)必須是該函數(shù)最后一個(gè)有名稱(chēng)參數(shù)的名稱(chēng)。必須先調(diào)用該宏,才可以開(kāi)始使用可選參數(shù)。

type va_arg(va_list argptr, type);

展開(kāi)宏 va_arg 會(huì)得到當(dāng)前 argptr 所引用的可選參數(shù),也會(huì)將 argptr 移動(dòng)到列表中的下一個(gè)參數(shù)。宏 va_arg 的第二個(gè)參數(shù)是剛剛被讀入的參數(shù)的類(lèi)型。

void va_end(va_list argptr);

 當(dāng)不再需要使用參數(shù)指針時(shí),必須調(diào)用宏 va_end。如果想使用宏 va_start 或者宏 va_copy 來(lái)重新初始化一個(gè)之前用過(guò)的參數(shù)指針,也必須先調(diào)用宏 va_end。

void va_copy(va_list dest, va_list src);

宏 va_copy 使用當(dāng)前的 src 值來(lái)初始化參數(shù)指針 dest。然后就可以使用 dest 中的備份獲取可選參數(shù)列表,從 src 所引用的位置開(kāi)始。

 例 1 中的函數(shù)展示了這些宏的使用方法。

【例1】函數(shù) add()

// 函數(shù)add() 計(jì)算可選參數(shù)之和
// 參數(shù):第一個(gè)強(qiáng)制參數(shù)指定了可選參數(shù)的數(shù)量,可選參數(shù)為double類(lèi)型
// 返回值:和值,double類(lèi)型
double add( int n, ... )
{
  int i = 0;
  double sum = 0.0;
  va_list argptr;
  va_start( argptr, n );             // 初始化argptr
  for ( i = 0; i < n; ++i )       // 對(duì)每個(gè)可選參數(shù),讀取類(lèi)型為double的參數(shù),
    sum += va_arg( argptr, double ); // 然后累加到sum中
  va_end( argptr );
  return sum;
}

以上是“C語(yǔ)言中可變參數(shù)函數(shù)有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI