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

c語言基于stdarg.h的可變參數(shù)函數(shù)的用法

 更新時間:2017年07月19日 14:42:53   作者:Myths  
本篇文章主要介紹了c語言基于stdarg.h的可變參數(shù)函數(shù)的用法,詳細的介紹了可變參數(shù)函數(shù)的詳細用法和源碼實例,有興趣的可以了解一下

C語言編程中有時會遇到一些參數(shù)個數(shù)可變的函數(shù),本文詳細講解了可變參數(shù)函數(shù)的實現(xiàn)原理,分享給大家

在開始學(xué)習(xí)C語言的函數(shù)的時候,我們就知道函數(shù)的參數(shù)個數(shù)應(yīng)該是在函數(shù)聲明的時候就指定的,這一點我們沒有任何疑問。但是不知道大家有沒有注意到我們的printf()函數(shù),他的函數(shù)參數(shù)理論上并不是確定的,而是隨著匹配字符串中的格式控制符的個數(shù)控制的。其實當時也沒有注意到這一點,到是最近,偶然間看到了 《嗨翻C語言》 這本書,這里就詳細講解了這種可變參數(shù)函數(shù)的實現(xiàn)原理,今天考試間隙就順帶學(xué)習(xí)了一下,其實就是一種方法,知道了就曉得了,也是非常的簡單。

頭文件

這個用法需要引用一些宏,這些宏定義在C標準庫“stdarg.h”中,(當然C++中就是“cstdarg”了)。

函數(shù)聲明

int fun(int arg1,int arg2, ...){
//foo
}


這里可以用普通傳參方法傳入幾個固定參數(shù),一般情況下會有個表示可變參數(shù)的個數(shù)(否則函數(shù)也不曉得你到底傳給了他啥),最后表示可變參數(shù)部分的是三個連續(xù)的點,注意中間不能有空格。我們傳入的可變參數(shù)就是在這里的。

具體用法

這里主要涉及到va_list類型,va_start()、va_arg()、va_end()這幾個函數(shù)。

va_list 可以理解為以鏈表的形式保存那些可變參數(shù)的一個數(shù)據(jù)類型(既然是鏈表,當然是可變的了)。

void va_start(va_list ap , int len); 接受兩個參數(shù),一個是上面的那個東西,還有一個表示數(shù)據(jù)的數(shù)目。目測可以理解為是自動收集傳給本函數(shù)的可變參數(shù),并連帶他的數(shù)目,將信息賦給 va_list 。

type va_arg(va_list ap , type ); 接受兩個參數(shù),一個是va_list,另一個是保存的數(shù)據(jù)的類型。因為在調(diào)用參數(shù)的時候,編譯器不會檢查實際輸入的是什么參數(shù),所以需要適時的指定,并以那個類型返回。注意,這時候在va_list中的某個指針會指向下一個元素,所以下一次調(diào)用時輸出的值就是下一個元素。在這一點上用法類似于iterator。

void va_end(va_list ap);最后清理這個va_list.

演示源碼

#include<stdarg.h>
#include<stdio.h>
void print(intarg,...){
 va_list ap;
 va_start(ap, arg);
 for (int i = 0; i < arg; i++){
 printf("%d ", va_arg(ap,int));
 }
 va_end(ap);
}
int main(){
 print(4, 1, 2, 3, 4);
}

結(jié)果自然是輸出 1 2 3 4。

說明

雖然看上去效果很酷,但是實際上據(jù)說這種用法的確很不安全,容易造成運行錯誤,所以還是盡量要少用。這種類似的問題如果能用重載或者類來解決的話還是少用可變參數(shù)函數(shù)吧。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于C語言代碼實現(xiàn)點餐系統(tǒng)

    基于C語言代碼實現(xiàn)點餐系統(tǒng)

    這篇文章主要為大家詳細介紹了基于C語言代碼實現(xiàn)點餐系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • C++運算符重載的方法詳細解析

    C++運算符重載的方法詳細解析

    運算符重載的方法是定義一個重載運算符的函數(shù),在需要執(zhí)行被重載的運算符時,系統(tǒng)就自動調(diào)用該函數(shù),以實現(xiàn)相應(yīng)的運算。也就是說,運算符重載是通過定義函數(shù)實現(xiàn)的
    2013-10-10
  • C++重載的奧義之運算符重載詳解

    C++重載的奧義之運算符重載詳解

    函數(shù)的重載是指利用相同的函數(shù)名設(shè)計一系列功能相近,但是功能細節(jié)不一樣的函數(shù)接口;因此運算符重載也是指對于同一個運算符來說,它可以用于實現(xiàn)不同的功能。下面就一起來理解下運算符重載的應(yīng)用吧
    2023-04-04
  • C語言strlen,strcpy,strcmp,strcat,strstr字符串操作函數(shù)實現(xiàn)

    C語言strlen,strcpy,strcmp,strcat,strstr字符串操作函數(shù)實現(xiàn)

    這篇文章主要介紹了C語言strlen,strcpy,strcmp,strcat,strstr字符串操作函數(shù)實現(xiàn),,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-09-09
  • C/C++中的內(nèi)存管理小結(jié)

    C/C++中的內(nèi)存管理小結(jié)

    這篇文章主要介紹了C/C++中的內(nèi)存管理小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • C++中strtok()函數(shù)的用法介紹

    C++中strtok()函數(shù)的用法介紹

    以下是對C++中strtok()函數(shù)的使用方法進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-09-09
  • Qt在線安裝加速的實現(xiàn)

    Qt在線安裝加速的實現(xiàn)

    本文主要介紹了Qt在線安裝加速的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • C++的四種類型轉(zhuǎn)換

    C++的四種類型轉(zhuǎn)換

    這篇文章主要介紹了C++的四種類型轉(zhuǎn)換,有詳細的示例代碼展示,對于學(xué)習(xí)C++的同學(xué)有一定的參考價值,感興趣的同學(xué)可以參考本文
    2023-04-04
  • C語言壓縮文件和用MD5算法校驗文件完整性的實例教程

    C語言壓縮文件和用MD5算法校驗文件完整性的實例教程

    這篇文章主要介紹了C語言壓縮文件和用MD5算法校驗文件完整性的實例教程,這里演示了Windows下將文件壓縮為7z格式以及MD5檢驗文件和密碼的方法,需要的朋友可以參考下
    2016-04-04
  • 詳解C++的String類的字符串分割實現(xiàn)

    詳解C++的String類的字符串分割實現(xiàn)

    這篇文章主要介紹了詳解C++的String類的字符串分割實現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2017-07-07

最新評論

南平市| 时尚| 泗洪县| 通化市| 大新县| 格尔木市| 夹江县| 鸡东县| 南部县| 万宁市| 芦溪县| 凤城市| 永兴县| 正镶白旗| 体育| 连南| 得荣县| 昭苏县| 象山县| 南平市| 黑河市| 通海县| 尼勒克县| 应城市| 临朐县| 铜山县| 商城县| 璧山县| 永胜县| 潍坊市| 米泉市| 康马县| 永康市| 墨玉县| 丹巴县| 茶陵县| 南通市| 封开县| 桃园市| 邮箱| 易门县|