c語言可變引數,引數傳遞 - eureka_ -
函式形參在函式中儲存是按照棧的方式來儲存的例項:
#include void fun(int a0,int a1,int a2, int函式輸出為:a3)}
intmain()
1 2 3 4
2、一般函式的定義在記憶體中的儲存方式
一般的變數定義之後,相同的變數型別儲存在相鄰的一塊記憶體
例子:
#include int輸出:main()
0xbf944c54:1
0xbf944c58:2
0xbf944c5c:3
0xbf944c6e:a
0xbf944c6f:b
0xbf944c40:1.10
0xbf944c48:2.20
**這個結論只是對於我自己的編譯器的結果,具體可能對於另外乙個編譯器的輸出有有可能不一樣,而且,如果把有變數沒有使用過的話,編譯器有可能丟棄它(自己的猜想而已,等過陣子研究《深入理解計算機系統》的時候在研究這個問題)。
標頭檔案stdarg.h
下面定義了四個巨集:
在stdarg.h中定義:typedef char * va_list;
這是第乙個呼叫的巨集,last是可變引數的前乙個確定的引數。因此只有可變引數的函式是不允許的,如fun(...)是不合法的。
#define va_start(ap,v) ( ap = (va_list)&v + _intsizeof(v) ) //第乙個可選引數位址
返回當前引數並且使ap指向下乙個引數,type是明確的型別名,就是獲取的型別,不是。
有va_start就必須有va_end,作用是使釋放ap
#define va_end(ap) ( ap = (va_list)0 ) // 將指標置為無效
每次呼叫va_copy時也必須要有va_end呼叫。
例子:
#include #include輸出:void fun(int
a,...)
putchar('\n
');va_end(ap);
}int
main()
1 2 3 4
--------------------------------
1 2 134514184 134514181
C語言可變引數傳遞
include include name前面的 號將name表示的值字串化 的作用是如果format後面沒有引數,可避免逗號存在的錯誤導致語法錯誤 define debug name,id,format,print log name,id,format,va args void print log ...
c 語言可變引數
1 當無法列出傳遞函式的所有實參的型別和數目時,可用省略號指定參數列 void foo void foo parm list,2 函式引數的傳遞原理 函式引數是以資料結構 棧的形式訪問,從右至左入棧.eg include void fun int a,int main output 12 343 獲...
c語言可變引數
ifdef debug print info x printk x,else print info x endif 一 什麼是可變引數 我們在c語言程式設計中有時會遇到一些引數個數可變的函式,例如printf 函式,其函式原型為 int printf const char format,它除了有乙個...