欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

1、簡介

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

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

例如查看到的printf的定義為

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

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

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

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

對于每一個強制參數(shù)來說,函數(shù)頭部都會顯示一個適當?shù)膮?shù),像普通函數(shù)聲明一樣。參數(shù)列表的格式是強制性參數(shù)在前,后面跟著一個逗號和省略號(...),這個省略號代表可選參數(shù)。

可變參數(shù)函數(shù)要獲取可選參數(shù)時,必須通過一個類型為 va_list 的對象,它包含了參數(shù)信息。這種類型的對象也稱為參數(shù)指針(argument pointer),它包含了棧中至少一個參數(shù)的位置。可以使用這個參數(shù)指針從一個可選參數(shù)移動到下一個可選參數(shù),由此,函數(shù)就可以獲取所有的可選參數(shù)。va_list 類型被定義在頭文件 stdarg.h 中。

void va_start(va_list argptr, lastparam);

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

type va_arg(va_list argptr, type);

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

void va_end(va_list argptr);

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

void va_copy(va_list dest, va_list src);

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

2、簡單的使用方式

// 函數(shù)add() 計算可選參數(shù)之和
// 參數(shù):第一個強制參數(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 )       // 對每個可選參數(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++中的ADO對SQLite進行增刪改查

    使用C++中的ADO對SQLite進行增刪改查

    本文將介紹如何使用C++的ADO (ActiveX Data Objects)對SQLite數(shù)據(jù)庫進行增刪改查操作,文中有詳細的代碼示例,需要的朋友可以參考下
    2023-06-06
  • 用C語言模仿Python函數(shù)的一種簡單實現(xiàn)方法

    用C語言模仿Python函數(shù)的一種簡單實現(xiàn)方法

    這篇文章主要介紹了用C語言模仿Python函數(shù)的一種簡單實現(xiàn)方法,需要的朋友可以參考下
    2017-05-05
  • c++重載的詳細總結(jié)

    c++重載的詳細總結(jié)

    作為成員函數(shù)重載符,對于雙目操作符重載函數(shù)只需一個形參,對于單目操作符重載函數(shù)不需要形參
    2013-09-09
  • c++基礎(chǔ)學習之如何區(qū)分引用和指針

    c++基礎(chǔ)學習之如何區(qū)分引用和指針

    C語言中只有指針,C++加入了引用,能夠起到跟指針類似的作用,下面這篇文章主要給大家介紹了關(guān)于c++基礎(chǔ)學習之區(qū)分引用和指針的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2021-08-08
  • C++課程設(shè)計之運動會管理系統(tǒng)

    C++課程設(shè)計之運動會管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C++課程設(shè)計之運動會管理系統(tǒng),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • C++線程安全的隊列你了解嘛

    C++線程安全的隊列你了解嘛

    這篇文章主要為大家詳細介紹了C++線程安全的隊列,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C++模板以及實現(xiàn)vector實例詳解

    C++模板以及實現(xiàn)vector實例詳解

    模板是為了實現(xiàn)泛型編程,所謂泛型編程,就是指編寫與類型無關(guān)的代碼,下面這篇文章主要給大家介紹了關(guān)于C++模板以及實現(xiàn)vector的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • OpenCV利用霍夫變換進行直線檢測

    OpenCV利用霍夫變換進行直線檢測

    這篇文章主要為大家詳細介紹了OpenCV利用霍夫變換進行直線檢測,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • C++實現(xiàn)LeetCode(76.最小窗口子串)

    C++實現(xiàn)LeetCode(76.最小窗口子串)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(76.最小窗口子串),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++操作文件進行讀取、刪除、修改指定行

    C++操作文件進行讀取、刪除、修改指定行

    今天小編就為大家分享一篇關(guān)于C++操作文件進行讀取、刪除、修改指定行,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12

最新評論