C語言中的不定引數

2021-08-31 03:01:03 字數 1359 閱讀 6469

1,最近剛剛知道c語言還有不定引數這麼個東東。

2,解決方法:

三個巨集的使用va_arg()、va_start()和va_end()

上述的巨集原型如下所示:

type va_arg(va_list argptr, type);

void va_end(va_list argptr);

void va_start(va_list argptr, last_parm);

它們都包含在標頭檔案中。

在vc++6.0中,這幾個巨集的定義:

#define _intsizeof(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1)) //型別n的大小

#define va_start(ap,v) ( ap = (va_list)&v + _intsizeof(v) ) //ap指向第乙個不定引數位址

#define va_arg(ap,t) ( *(t *)((ap += _intsizeof(t)) - _intsizeof(t)) ) //下乙個引數位址 返回當前ap指向的值,並且增加ap

#define va_end(ap) ( ap = (va_list)0 ) // 將指標置為無效

總結:讀取可變引數的過程其實就是堆疊中,使用指標,遍歷堆疊段中的引數列表,從低位址到高位址乙個乙個地把引數內容讀出來的過程.

3,不定引數函式有個限制,就是不定引數的列表必須在整個函式的引數列表的最後。

我們不可以定義如下的函式:

void func(int a, ……, int c)

所有型別固定的引數都必須出現在引數列表的開始。

在設計具有不定引數列表的函式的時候,我們有兩種方法來確定到底多少引數會被傳遞進來。

方法1是在型別固定的引數中指明後面有多少個引數以及他們的型別。printf就是採用的這種方法,它的format引數指明後面每個引數的型別。

方法2是指定乙個結束引數。這種情況一般是不定引數擁有同樣的型別,我們可以指定乙個特定的值來表示引數列表結束。

4,例項**:

#include

#include

#include

int sumi(int c, ...)

va_end(argptr);

return sum;

}double sum_series(int num, ...)

va_end(argptr);

return sum;

}int main()

c語言中的不定引數

在採用c語言程式設計時,函式中的形式引數數目通常是確定的,在呼叫的時候要依次給出與形式引數對應的所有實際引數,但在某些情況下希望函式的引數個數可以根據需要確定,如printf,scanf函式等,c編譯器提供了一系列處理這種情況的巨集,以遮蔽不同的硬體平台造成的差異,增加程式的可移植性,這些巨集包括v...

c語言中處理不定引數

c語言中處理不定引數數目 在程序中,堆疊位址是從高到低分配的.當執行乙個函式的時候,將引數列表入棧,壓入堆疊的高位址部分,然後入棧函式的返回位址,接著入棧函式的執行 這個入棧過程,堆疊位址不斷遞減,一些黑客就是在堆疊中修改函式返回位址,執行自己的 來達到執行自己插入的 段的目的.在函式呼叫時,第乙個...

C語言中不定引數個數的函式

c 中有函式過載這種方法,以供我們呼叫時要可以不確定實參的個數,其實c語言也可以,而且更高明!我們在stdio.h中可以看到printf 函式的原型 int printf char format,事實上,我們如果要寫這樣的函式也可以類似的寫,那麼在定義函式時用上這個符號 它叫佔位符,喊它 三個點 也...