c語言中的可變引數
1、c語言中的可變引數列表:c語言中有時候會遇到一些引數個數是可變的函式,像scanf,printf等,這些函式內部的引數列表都是可變的。通過將函式實現為可變引數的形式,使得函式可以接受1個以上的任意多個引數。(不固定)
如函式原型:scanf(const char * format,…);
解釋:除了format以外,後面跟著的引數 個數,型別是可變的,用…作為一種佔位符號。「…」稱為可變引數列表,可以用來接受個數和型別不確定的引數。
再例如printf()是乙個支援可變引數的函式,可以有多個引數。函式原型:int printf(const char *format,...) 省略號代表引數的個數是不固定的。
(1)可變引數列表在c語言中使用這樣的三個巨集(va_start,va_arg,va_end)和乙個型別(va_list)來進行實現的,他們
是定義在stdarg.h標頭檔案中的。 1)
va_start原型
:void va_start(va_list ap,paramn);
引數:va_list:儲存引數的型別資訊
ap:可變引數列表位址
paramn:確定的引數
2)
va_arg原型
:
void va_arg(va_list ap,type);返回下乙個引數的值
3)va_end原型:
void va_end(va_list ap,type);關閉初始化的列表
使用方式:
1) 使用va_list初始化可變引數列表
2) 使用va_arg逐個獲取引數值
3)用va_end將可變引數列表清空
可變引數列表的限制條件:至少有乙個引數
例子:模擬prinf函式的實現:
#define _crt_secure_no_warnings
#include #include #include #include void reverse(char * buf) //將按順序列印出來的字串翻轉,被myitoa函式呼叫。
}char *myitoa(int n) //將int型的數字轉化為字串,100(int)->"001",通過reverse函式"001"->"100".
while (n != 0);
reberse(buf);
return buf;
}void myputs(const char *buf) //列印被myitoa轉換好的字串。
void myprint(char * p,...) //模擬printf函式
break;
case 'c':
break;
case 's':
break;
default:
break;
}} else
} va_end(str);
}int main()
標頭檔案提供了
遍歷未知數目和型別的函式引數列表的功能。
2、實現可變引數的要點就是想辦法取得每個引數的位址,取得位址的辦法由以下幾個因素決定:
①函式棧的生長方向
②引數的入棧順序
③cpu的對齊方式
④記憶體位址的表達方式 3、
可變引數的限制:
可變引數列表原始碼剖析
c語言中的可變引數列表,顧名思義,在c語言中有一些特殊的函式,它們的引數不是固定的,可以是多種型別的任意多個引數。比如最常用的printf函式和scanf函式,通過使用可變引數列表,使函式可以接收 1個的多種型別的引數。用printf函式的原型來舉例子 int printf const char f...
可變引數列表原始碼的剖析
在某些情況下我們希望函式引數的個數可以根據實際需要來確定,所以c語言中就提供了一種長度不確定的引數,形如 通過將函式實現為可變引數的形式,可以使得函式可以接受1個以上的任意多個引數。典型的例子有printf scanf 函式等,下面就用printf函式的原型為例分析 int printf const...
可變引數列表原始碼的剖析
首先看看main函式的引數 首先我們得知道main函式是有引數的,那麼我們就來看看main函式的原型 int main int argc,int argv,char envp program statements 那麼我們看到這裡有三個引數 第乙個引數 argc是個整形引數,表示命令行引數的個數 含...