C 傳遞不定參函式

2022-06-30 04:30:12 字數 1053 閱讀 8744

定義不定引數函式,要用到下面這些巨集:

c語言裡編寫不定引數函式的形式是這樣的:

#include int sum(int cnt,...)

定義不定引數函式,要用到下面這些巨集:

typedef char * va_list;

#define _intsizeof(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )

#define va_start(ap,v) ( ap = (va_list)&v + _intsizeof(v) )

#define va_arg(ap,t) ( *(t *)((ap += _intsizeof(t)) - _intsizeof(t)) )

#define va_end(ap) ( ap = (va_list)0 )

注意:上面這些巨集定義會因不同的系統和不同的處理器架構而不同

_intsizeof巨集

_intsizeof這個巨集的位運算意義比較難理解,乍一看以為是表示多少個int型的長度,其實它運算出來的結果是按照int型對齊後的長度。比如int型為4個位元組,_intsizeof(1)、_intsizeof(2)、_intsizeof(3)、_intsizeof(4)的結果都是4,_intsizeof(5)、_intsizeof(6)、_intsizeof(7)、_intsizeof(8)的結果都是8,這正是x86架構cpu下的引數傳遞方式,32位即4位元組對齊。

幾個注意事項不定引數函式最常用來格式化字串,乙個比較常見的場景是我們想輸出一些log訊息,但又不能直接在控制台輸出,需要自己寫乙個log函式來格式化log訊息並輸出。這時我們可以用vsprintf函式:

void log(const char *format, ...)

vsprintf函式的前兩個引數和sprintf的前兩個引數意義相同,只不過後面的不定參換成了va_list型別的引數列表,這正是讓我們用來定義自己的格式化函式的。

python函式不定參

寫函式時,預先可能不確定會傳入多少個引數,以及傳入的方式,這時候可以通過不定參的形式傳遞 def test args,kwargs print args args print kwargs kwargs if name main test 1,2,3,4,a 5,b 6,c 7 args 1,2,3...

c 函式傳參 值傳遞 指標傳遞 引用傳遞

1 將變數名作為實參和形參 這時傳給形參的是變數的值,傳遞是單向的。如果在執行函式期間形參的值發生變化,並不傳回實參。應為在呼叫函式時,形參和實參不是同乙個儲存單元。2 傳遞變數的指標 形參是指標變數,實參是乙個變數的位址,呼叫函式時,形參指向實參變數單元。可以通過形參指標修改實參的值。3 c 提供...

python3 函式 不定長引數 不定參

第一種不定長引數 args args 稱為不定長引數,只能放在形參的最後位置,返回的是乙個元組 def num a,b,args print a print b print args num 11,22 返回結果 1122 33,55會放在元組args中 num 11,22,33,55 返回結果 1...