最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言的可變參數(shù)函數(shù)實(shí)現(xiàn)詳解

 更新時(shí)間:2021年08月26日 11:51:46   作者:Suifqwu  
某些情況下我們希望函數(shù)的參數(shù)個(gè)數(shù)可以根據(jù)需要確定,因此c語言引入可變參數(shù)函數(shù)。典型的可變參數(shù)函數(shù)的例子有printf()、scanf()等,下面我就開始講解

1、簡介

今天看到一個(gè)有趣的東西C語言的可變參數(shù)函數(shù)

眾所周知,C語言的函數(shù)不能重載,那么你printf和scanf是怎么可以輸入多個(gè)參數(shù)的

例如查看到的printf的定義為

printf(const char *_Restrict, ...);

這稱為可變參數(shù)函數(shù)。這種函數(shù)需要固定數(shù)量的強(qiáng)制參數(shù),后面是數(shù)量可變的可選參數(shù)

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

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

對(duì)于每一個(gè)強(qiáng)制參數(shù)來說,函數(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í),必須通過一個(gè)類型為 va_list 的對(duì)象,它包含了參數(shù)信息。這種類型的對(duì)象也稱為參數(shù)指針(argument pointer),它包含了棧中至少一個(gè)參數(shù)的位置??梢允褂眠@個(gè)參數(shù)指針從一個(gè)可選參數(shù)移動(dòng)到下一個(gè)可選參數(shù),由此,函數(shù)就可以獲取所有的可選參數(shù)。va_list 類型被定義在頭文件 stdarg.h 中。

void va_start(va_list argptr, lastparam);

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

type va_arg(va_list argptr, type);

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

void va_end(va_list argptr);

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

void va_copy(va_list dest, va_list src);

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

2、簡單的使用方式

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

以上內(nèi)容均來自-

http://c.biancheng.net/view/344.html

總結(jié)

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • C++采用openfilename打開文件對(duì)話框用法實(shí)例

    C++采用openfilename打開文件對(duì)話框用法實(shí)例

    這篇文章主要介紹了C++采用openfilename打開文件對(duì)話框用法實(shí)例,是C++文件操作中非常實(shí)用的技巧,需要的朋友可以參考下
    2014-10-10
  • Qt自定義控件實(shí)現(xiàn)圓圈加載進(jìn)度條

    Qt自定義控件實(shí)現(xiàn)圓圈加載進(jìn)度條

    這篇文章主要為大家詳細(xì)介紹了Qt自定義控件實(shí)現(xiàn)圓圈加載進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C語言中求和、計(jì)算平均值、方差和標(biāo)準(zhǔn)差的實(shí)例

    C語言中求和、計(jì)算平均值、方差和標(biāo)準(zhǔn)差的實(shí)例

    這篇文章主要介紹了C語言中求和、計(jì)算平均值、方差和標(biāo)準(zhǔn)差的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C++菱形繼承和虛繼承的實(shí)現(xiàn)

    C++菱形繼承和虛繼承的實(shí)現(xiàn)

    本文主要介紹了C++菱形繼承和虛繼承的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 利用C++實(shí)現(xiàn)一個(gè)線程安全的map

    利用C++實(shí)現(xiàn)一個(gè)線程安全的map

    這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)一個(gè)線程安全的map(使用ChatCPT生成),代碼是通過兩輪對(duì)話完善的,感興趣的小伙伴可以了解一下
    2023-05-05
  • C++解密Chrome80版本數(shù)據(jù)庫的方法示例代碼

    C++解密Chrome80版本數(shù)據(jù)庫的方法示例代碼

    這篇文章主要介紹了C++解密Chrome80版本數(shù)據(jù)庫的方法示例代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • C++類結(jié)構(gòu)體與json相互轉(zhuǎn)換

    C++類結(jié)構(gòu)體與json相互轉(zhuǎn)換

    這篇文章主要介紹的是C++類結(jié)構(gòu)體與json相互轉(zhuǎn)換,json字符串一般使用的是開源的類庫Newtonsoft.Json,方法十分簡潔,下面就隨小編一起看下面文章內(nèi)容吧
    2021-09-09
  • OpenCV實(shí)現(xiàn)輪廓檢測(cè)與繪制

    OpenCV實(shí)現(xiàn)輪廓檢測(cè)與繪制

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)輪廓檢測(cè)與繪制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 詳解利用C語言如何實(shí)現(xiàn)簡單的內(nèi)存池

    詳解利用C語言如何實(shí)現(xiàn)簡單的內(nèi)存池

    這篇文章主要給大家介紹了關(guān)于C語言如何實(shí)現(xiàn)簡單的內(nèi)存池的相關(guān)資料,設(shè)計(jì)內(nèi)存池的目標(biāo)是為了保證服務(wù)器長時(shí)間高效的運(yùn)行,通過對(duì)申請(qǐng)空間小而申請(qǐng)頻繁的對(duì)象進(jìn)行有效管理,減少內(nèi)存碎片的產(chǎn)生,合理分配管理用戶內(nèi)存,需要的朋友可以參考下
    2021-08-08
  • C++之編寫高效Makefile文件最佳方法

    C++之編寫高效Makefile文件最佳方法

    在軟件開發(fā)過程中,Makefile是一個(gè)非常重要的工具,它可以幫助我們自動(dòng)化構(gòu)建、編譯、測(cè)試和部署,然而,編寫高效的Makefile文件并不是一件容易的事情。在本文中,我們將討論如何編寫高效的Makefile文件,以提高開發(fā)效率和產(chǎn)品質(zhì)量,需要的朋友可以參考下
    2023-05-05

最新評(píng)論

桑植县| 健康| 新龙县| 波密县| 芜湖县| 井研县| 云林县| 漾濞| 玉树县| 柳河县| 南丹县| 桂林市| 东安县| 山阴县| 慈溪市| 萝北县| 天津市| 略阳县| 谢通门县| 廊坊市| 开鲁县| 天镇县| 永胜县| 吉木萨尔县| 招远市| 商都县| 金堂县| 随州市| 莎车县| 同心县| 仁寿县| 兴海县| 邵阳县| 阳原县| 瑞金市| 青龙| 晋江市| 桃园县| 天台县| 金门县| 顺义区|