1. 程式人生 > >理解printf可變引數函式

理解printf可變引數函式

瞭解了下可變參函式的原理,這裡記錄下方便自己以後看

printf函式原型 int printf(const char *fmt, ...)

這裡寫個例子方便理解 printf("%s\n","hello");

函式傳參引數壓棧的方向是從右往左,也就是說當呼叫printf函式的時候,先是最右邊的“hello”引數入棧,然後才是

“%s\n”,指標也是變數,也有地址,入棧入的是這兩個指標的地址,棧是從高地址向低地址方向增長的。所以在棧內地址順序

是 ("hello" 指標的地址 [ 高 ]) ->("%s\n"指標的地址 [ 低 ]),而“%s\n”的地址是知道的,就是 fmt引數的地址,用這個地址加上一個指標的長度就是傳入的第一個引數的地址,也就是這裡的“hello”的地址,所以 fmt+sizeof(char *)就是第一個引數,由於在同一系統中指標長度是固定的,這樣就可以算出第2個,第3個以及後面的引數,再從fmt字串中找到對應的%後面的字元,就能確定需要列印幾個引數