C語言可變引數,引數傳遞

2021-09-08 20:48:22 字數 1425 閱讀 3875

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,它除了有乙個...