日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言中函数可变参数解析

發(fā)布時(shí)間:2025/3/21 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言中函数可变参数解析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

大多數(shù)時(shí)候,函數(shù)中形式參數(shù)的數(shù)目通常是確定的,在調(diào)用時(shí)要依次給出與形式參數(shù)對應(yīng)的所有實(shí)際參數(shù)。但在某些情況下希望函數(shù)的參數(shù)個數(shù)可以根據(jù)需要確定。典型的例子有

大家熟悉的函數(shù)printf()、scanf()

  可變參數(shù)的實(shí)現(xiàn):

  C語言頭文件stdarg.h提供了一個數(shù)據(jù)類型va-list和三個宏(va-start、va-arg和va-end),va—start使vp指向第一個可選參數(shù)。va—arg返回參數(shù)列表中的當(dāng)前參數(shù)并使vp指向參數(shù)列表中的下一個參數(shù)。va

?

—end把vp指針清為NULL。函數(shù)體內(nèi)可以多次遍歷這些參數(shù),但是都必須以va—start開始,并以va—end結(jié)尾。用它們在被調(diào)用函數(shù)不知道參數(shù)個數(shù)和類型時(shí)對可變參數(shù)表進(jìn)行測試,從而為訪問可變參數(shù)提供

?

了方便且有效的方法。va-list是一個char類型的指針,當(dāng)被調(diào)用函數(shù)使用一個可變參數(shù)時(shí),它聲明一個類型為va-list的變量,該變量用來指向va-arg和va-end所需信息的位置。

?

下面給出va_list在C中的源碼:

   ?typedef char * va_list;?

  采用ANSI標(biāo)準(zhǔn)形式時(shí),參數(shù)個數(shù)可變的函數(shù)的原型聲明是:

   ? type funcname(type para1, type para2, ...)?

  這種形式至少需要一個普通的形式參數(shù),后面的省略號不表示省略,而是函數(shù)原型的一部分,type是函數(shù)返回值和形式參數(shù)的類型。

?

  調(diào)用者在實(shí)際調(diào)用參數(shù)個數(shù)可變的函數(shù)時(shí),要通過一定的方法指明實(shí)際參數(shù)的個數(shù),例如把最后一個參數(shù)置為空字符串。

  

  下面給出一個具體的例子:

求n個數(shù)的和:

int Sum(int n,...) {int i = 0,sum = 0;va_list vp; va_start(vp,n); //va—start使vp指向第一個可選參數(shù)for (i=0; i<n; i++){sum +=va_arg(vp,int); }va_end(vp); //va—end把vp指針清為NULL。return sum; }

printf函數(shù)實(shí)現(xiàn):(此處只實(shí)現(xiàn)了基本類型的打印)

1 void my_print(const char *format,...)2 {3 char c = 0;4 va_list vp; 5 va_start(vp,format); //vp指向第一個可選參數(shù)6 while (*format)7 {8 c = *format;9 switch (c) 10 { 11 case '%': 12 { 13 char cc = *(++format); 14 switch (cc) 15 { 16 case 'd': 17 { 18 char str[50]; 19 int n = va_arg(vp,int); //va—arg返回參數(shù)列表中的當(dāng)前參數(shù)并使vp指向參數(shù)列表中的下一個參數(shù)。 20 char *string = _itoa(n,str,10); //把整數(shù)轉(zhuǎn)為字符串 21 print_str(string); 22 } 23 break; 24 case 'f': 25 { 26 char str[50]; 27 double f = va_arg(vp,double);//va—arg返回參數(shù)列表中的當(dāng)前參數(shù)并使vp指向參數(shù)列表中的下一個參數(shù) 28 char *string = _gcvt(f,10,str);//將浮點(diǎn)型數(shù)轉(zhuǎn)換為字符串,取四舍五入 29 print_str(string); 30 } 31 break; 32 case 'c': 33 putchar(va_arg(vp,char)); 34 break; 35 case 's': 36 { 37 char *string = va_arg(vp,char*); 38 print_str(string); 39 } 40 break; 41 default: 42 break; 43 } 44 } 45 break; 46 default: 47 putchar(c); 48 break; 49 } 50 format++; 51 } 52  va_end(vp); 53 }

理解可變參數(shù)很重要的是要理解函數(shù)棧幀的創(chuàng)建與銷毀,里面涉及到參數(shù)是如何壓棧,這方面內(nèi)容在前面的博客:http://www.cnblogs.com/zhonglongbo/p/8392026.html

總結(jié)

以上是生活随笔為你收集整理的C语言中函数可变参数解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。