可變引數列表原始碼的剖析

2021-08-13 10:09:39 字數 1784 閱讀 5195

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是個整形引數,表示命令行引數的個數 含...