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

C語言可變參數(shù)函數(shù)詳解

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

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

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

這種函數(shù)必須至少有一個(gè)強(qiáng)制參數(shù)??蛇x參數(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 中。

當(dāng)編寫支持參數(shù)數(shù)量可變的函數(shù)時(shí),必須用 va_list 類型定義參數(shù)指針,以獲取可選參數(shù)。在下面的討論中,va_list 對(duì)象被命名為 argptr??梢杂?4 個(gè)宏來處理該參數(shù)指針,這些宏都定義在頭文件 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 所引用的位置開始。

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

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

// 函數(shù)add() 計(jì)算可選參數(shù)之和
// 參數(shù):第一個(gè)強(qiáng)制參數(shù)指定了可選參數(shù)的數(shù)量,可選參數(shù)為double類型
// 返回值:和值,double類型
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ù),讀取類型為double的參數(shù),
    sum += va_arg( argptr, double ); // 然后累加到sum中
  va_end( argptr );
  return sum;
}

總結(jié)

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

相關(guān)文章

  • Qt開發(fā)之QTreeWidget的使用教程詳解

    Qt開發(fā)之QTreeWidget的使用教程詳解

    這篇文章主要為大家詳細(xì)介紹了Qt中QTreeWidget使用的相關(guān)資料,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Qt有一定的幫助,感興趣的小伙伴可以了解一下
    2022-12-12
  • C++高級(jí)數(shù)據(jù)結(jié)構(gòu)之并查集

    C++高級(jí)數(shù)據(jù)結(jié)構(gòu)之并查集

    這篇文章主要介紹了C高級(jí)數(shù)據(jù)結(jié)構(gòu)之并查集,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • 詳解C++中mutable的用法

    詳解C++中mutable的用法

    這篇文章主要介紹了詳解C++中mutable的用法,幫助大家更好的理解和學(xué)習(xí)C++,感興趣的朋友可以了解下
    2020-08-08
  • C/C++語言八大排序算法之桶排序全過程示例詳解

    C/C++語言八大排序算法之桶排序全過程示例詳解

    這篇文章主要為大家介紹了C/C++語言八大排序算法之桶排序算法過程的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • C語言判定一棵二叉樹是否為二叉搜索樹的方法分析

    C語言判定一棵二叉樹是否為二叉搜索樹的方法分析

    這篇文章主要介紹了C語言判定一棵二叉樹是否為二叉搜索樹的方法,結(jié)合實(shí)例形式綜合對(duì)比分析了C語言針對(duì)二叉搜索樹判定的原理、算法、效率及相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-08-08
  • C語言實(shí)現(xiàn)航班訂票系統(tǒng)

    C語言實(shí)現(xiàn)航班訂票系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)航班訂票系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • OpenCV實(shí)現(xiàn)繪制輪廓外接矩形

    OpenCV實(shí)現(xiàn)繪制輪廓外接矩形

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)繪制輪廓外接矩形的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-12-12
  • C/C++實(shí)現(xiàn)動(dòng)態(tài)數(shù)組的示例詳解

    C/C++實(shí)現(xiàn)動(dòng)態(tài)數(shù)組的示例詳解

    動(dòng)態(tài)數(shù)組相比于靜態(tài)數(shù)組具有更大的靈活性,因?yàn)槠浯笮】梢栽谶\(yùn)行時(shí)根據(jù)程序的需要?jiǎng)討B(tài)地進(jìn)行分配和調(diào)整,本文為大家介紹了C++實(shí)現(xiàn)動(dòng)態(tài)數(shù)組的方法,需要的可以參考下
    2023-08-08
  • C語言 深入淺出講解指針的使用

    C語言 深入淺出講解指針的使用

    指針是C語言中一個(gè)非常重要的概念,也是C語言的特色之一。使用指針可以對(duì)復(fù)雜數(shù)據(jù)進(jìn)行處理,能對(duì)計(jì)算機(jī)的內(nèi)存分配進(jìn)行控制,在函數(shù)調(diào)用中使用指針還可以返回多個(gè)值
    2022-03-03
  • 詳解state狀態(tài)模式及在C++設(shè)計(jì)模式編程中的使用實(shí)例

    詳解state狀態(tài)模式及在C++設(shè)計(jì)模式編程中的使用實(shí)例

    這篇文章主要介紹了state狀態(tài)模式及在C++設(shè)計(jì)模式編程中的使用實(shí)例,在設(shè)計(jì)模式中策略用來處理算法變化,而狀態(tài)則是透明地處理狀態(tài)變化,需要的朋友可以參考下
    2016-03-03

最新評(píng)論