麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

C語言變參函數

2019-11-08 02:51:27
字體:
來源:轉載
供稿:網友

http://www.cnblogs.com/hnrainll/archive/2011/07/06/2099494.html

http://baike.baidu.com/link?url=LVqNiDgwI3huqGZZwD8PR_iN5TTfUe-zKr6BX380Pm6i5tu3dFGdyT-p2TaV0DzLnRAZ10U5ZbwIYcHS7SKJ-a

http://blog.chinaunix.net/uid-25572546-id-2183161.html

#include <stdio.h>#include <stdarg.h>//模擬實現系統提供的printf函數int vpf(char*fmt,...){va_list ap;int cnt; va_start(ap,fmt);//第一個參數為指向可變參數字符指針的變量,第二個參數是可變參數的第一個參數,通常用于指定可變參數列表中參數的個數cnt=vprintf(fmt,ap); va_end(ap);//將存放可變參數字符串的變量清空return(cnt);}int main(void){int inumber=30;float fnumber=90.0;char* string="abc";vpf("%d/n%f/n%s/n",inumber,fnumber,string);return 0;}

http://blog.csdn.net/jiqiren007/article/details/5935125

C語言中有很多變參的使用,例如printf()的原型是int printf(const char *fmt, ...),那么C語言是如何解析和處理這些變參的呢?下面進行簡單的總結:

C語言中定義了下面的一些宏,專門用來處理變參:

va_start(va_list ap, char *fmt)

va_arg(va_list ap , Type) //Type是指參數的類型(比如int、char*、double)

va_end(va_list ap)

從上面三個宏可以看到,它們都有一個va_list類型的參數,那么va_list是什么呢?如何定義的呢?

typedef char* va_list;可以看到va_list其實就是char*

下面繼續解析上面的三個宏:

va_start(va_list ap, char*fmt)

其中ap是va_list類型的,即可變參數列表;而fmt就是printf等類似函數的參數,指明參數的類型等,例如常見的有:%d%s%c%f等等

va_list()操作進行后的效果是:使得ap指向fmt后面的參數列表,即"...".C語言函數參數是從右向左壓棧的

這個操作要在其他兩個操作前面執行

va_arg(va_list ap, Type)

在執行完va_start()操作后,ap就指向了變參的列表,這個時候就可以對變參列表進行操作了,是通過對ap進行操作實現的,因為此時ap指向變參列表

va_arg(va_list ap, Type)的結果是這樣的:執行完這個操作后,首先返回ap當前指向的參數;然后ap向后移動,執行下一個參數;因此va_arg()是要循環調用的,直到所有參數都獲得

Type是當前參數的類型

va_end(va_list ap)

當上面操作進行完后,ap不再使用了,需要調用va_end()操作將ap給清空

根據上面的描述,在C語言中處理變參的過程大概是這樣的:

定義va_list 變量,用來指向參數列表調用va_start()操作,將定義的va_list變量指向變參列表調用va_arg()操作,獲得每個參數調用va_end()操作,清空va_list變量

從上面的過程可以看到,在執行第三步的時候有點麻煩,比如事先根本不知道參數的類型等,這樣調用va_arg()就不太方便了;而在實際中這樣的現象是很多的,可以采用下面的策略解決:

當調用完va_start()操作后,ap已經指向了變參列表了;然后調用vprintf(const char *fmt, va_list ap)將參數進行輸出。當然也可以調用vsprintf(char *str, const char *fmt, va_list ap)、vsnprintf(char *str, size_t size, const char *fmt, va_list ap)來將變參保存起來進行處理。

 

通過上面的描述,可以實現一個自己的printf了:

int my_printf(cosnt char *fmt, ...)

{

va_list ap; //定義va_list 變量

va_start(ap, fmt); //讓ap指向變參...

int n = vprintf(fmt, ap); //調用vprintf進行輸出

return n; //返回輸出的字符數,printf返回值是int

}

需要注意的地方:

在使用C語言的變參時,需要將變參(即...)放在最后一個參數的位置;并且變參前面至少要有一個普通的參數
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产精品成人av片免费看最爱 | 欧美精品99 | 久久伊| 国内精品久久久久久久久久 | 成人免费一区二区三区在线观看 | 欧美成人se01短视频在线看 | 国产88久久久国产精品免费二区 | 成人福利网| 国产精品久久久久影院老司 | 中文日韩欧美 | 香蕉视频18 | 欧美aaaaa一级毛片在线 | 九九看片 | 99精品视频网站 | 欧美性videofree精品 | 91一区二区三区久久久久国产乱 | 久久激情免费视频 | 成人一级免费视频 | 国产精品视频二区不卡 | 黄色大片在线免费观看 | 国产片91 | 99麻豆久久久国产精品免费 | 国产精品一区二区视频 | xxxxxx免费| 久久精品观看 | 视频一区 日韩 | 黄色免费小视频网站 | 国产羞羞网站 | 免费国产不卡午夜福在线 | 欧美淫交 | 久久久无码精品亚洲日韩按摩 | 国产成人精品一区二区视频免费 | 亚洲第一视频在线 | 国产精品久久久久久久久久 | 午夜视频在线 | japan护士性xxxⅹhd | 99影视在线视频免费观看 | 日韩精品无码一区二区三区 | 日日夜av | 久色婷婷 | 成人免费看视频 |