變參函式其實並不罕見,在初學者的的 helloworld 程式中就用到了變參函式 printf() ,在之後的學習當中,scanf() 又是另乙個常見的變參函式。
這些函式有以下共同特點:
在函式呼叫過程中,相應記憶體的棧空間會增長,這時函式引數會被壓到棧中。在普通函式執行時,函式根據引數列表得知棧內的引數型別以及個數,計算出相應引數的位址 和 占用空間大小,從而從棧中獲取各個形參變數。
變參函式也要知道實際傳入引數的型別以及個數,通過變參列表的起始位置,計算出所有引數的位址以及長度,這樣成功讀取到所有傳入的引數。
c語言的變參函式需要傳入至少乙個在變參列表之外的固定引數,而這個固定引數所起到的作用就是 告訴函式變參列表的型別及個數 和 定位變參列表的位置。
#include
#include
#include
intmy_printf
(const
char
*format,..
.)break;}
}}va_end
(valist)
;//清理為valist開闢的記憶體
}int
main()
輸出結果
int
:12850
float
:546.617981
char
: glong
:1564323
double
:45854.825500
char
*: hello world !
C語言變參函式的實現原理
1.變參函式簡單示例 include include int accumlate int nr,va end arg return result int main 2.變參函式的實現原理 define va list void define va start arg,start arg va lis...
C語言(變參函式)
c語言雖然沒有c 的函式過載特性,但也可以實現變參,但要保證第乙個引數資訊的完整性。拓展 定義變參函式時,第乙個引數一般是字串,攜帶後續變參的型別和數量資訊,變參使用三點來表示,如 void sumup const char info,再使用va list va start va arg 和va e...
C語言中的變參原理
在c c 中,對函式引數的掃瞄是從後向前的。c c 的函式引數是通過壓入堆疊的方式來給函式傳引數的 堆疊是一種先進後出的資料結構 最先壓入的引數最後出來printf的第乙個被找到的引數就是那個字元指標,就是被雙引號括起來的那一部分,函式通過判斷字串裡控制引數的個數來判斷引數個數及資料型別,通過這些就...