如何在C語言中定義引數數目可變的函式

2021-04-18 23:10:08 字數 4339 閱讀 2492

1樓:

定義如下:

《函式返回值> 函式名(形參1, 形參2, ...)舉例說明:

int  func(int a, int b, ...)printf()函式就是一個引數版

可變的函式,其函式原型

權為:int printf (const char *__format, ...);

c語言中如何實現可變參函式

2樓:匿名使用者

c語言中可變參函式實現,主要通過va_list巨集及相關操作的幾個巨集。

一、涉及巨集及說明:

所有相關巨集均定義在stdarg.h中。

1、va_list: 可變引數列表指標。

2、va_start:獲取可變引數列表的第一個引數的地址。

3、va_arg:獲取可變引數的當前引數,返回指定型別並將指標指向下一引數。

4、va_end:清空va_list可變引數列表。

可變參函式的實現,就是這四個巨集的使用。

二、**舉例:

在實際應用中,經常有獲取若干個數最大值的情況,當數量比較大的時候,一般通過陣列實現,但個數不多時,一般寫一個max函式。 常規寫法都是用到幾個數的max,就寫幾個引數, 對此可以實現一個可變引數函式,第一個引數指定共計有多少資料,後續各個引數為要比較的值。

#include

#include

int max(int n, ...)//可變引數函式。

分別測試了1,2,3,4個數值,求取最大值的情況。

測試結果:1299

3樓:馬小芳

1、標準c庫的中的三個巨集的作用只是用來確定可變引數列表中每個引數的記憶體地址,編譯器是不知道引數的實際數目的。

2、在實際應用的**中,程式設計師必須自己考慮確定引數數目的辦法,如

⑴在固定引數中設標誌—— printf函式就是用這個辦法。

⑵在預先設定一個特殊的結束標記,就是說多輸入一個可變引數,呼叫時要將最後一個可變引數的值設定成這個特殊的值,在函式體中根據這個值判斷是否達到引數的結尾。本文前面的**就是採用這個辦法.

無論採用哪種辦法,程式設計師都應該在文件中告訴呼叫者自己的約定。

3、實現可變引數的要點就是想辦法取得每個引數的地址,取得地址的辦法由以下幾個因素決定:

①函式棧的生長方向

②引數的入棧順序

③cpu的對齊方式

④記憶體地址的表達方式

結合源**,我們可以看出va_list的實現是由④決定的,_intsizeof(n)的引入則是由③決定的,他和①②又一起決定了va_start的實現,最後va_end的存在則是良好程式設計風格的體現,將不再使用的指標設為null,這樣可以防止以後的誤操作。

4、取得地址後,再結合引數的型別,程式設計師就可以正確的處理引數了。。

c語言如何定義一個可變引數函式 如何呼叫其輸入的引數 分別

4樓:匿名使用者

有專門的巨集,處理可變參

void va_start( va_list arg_ptr, prev_param );

type va_arg( va_list arg_ptr, type );

void va_end( va_list arg_ptr );

一個簡單的例子

void ******_va_fun(int i, ...)int main()

5樓:圭仁丘妍

傳值呼叫

和引用呼叫  傳值呼叫和引用呼叫指的是用於引數傳遞過程中的一種機制。傳值呼叫中,只使用了實參的值。傳值呼叫機制裡,形參是一個區域性變數,其初始值為相應實參的值。

在引用呼叫機制裡,將實參的地址傳遞給形參,從表面上看是以實參變數取代形參,因此任何發生在形參上的改變實際上都發生在實參變數上。

形參的作用是實現主調函式與被調函式之間的聯絡,通常將函式所處理的資料,影響函式功能的因素或者函式處理的結果作為形參。沒有形參的函式在形參表的位置應該寫void.main

函式也可以有形參和返回值,其形參也稱為命令列引數,由作業系統在啟動程式時初始化,其返回值傳遞給作業系統。

形參和實參的對照例項(c語言版)  main()    ints(intn)

c語言中如何獲取函式可變引數的個數?

c語言函式定義時,可變引數型別已定,個數不定,應該怎麼做?

6樓:賺錢啊呀

這個錯誤是你宣告的某些變數佔用空間太大,沒可用的空間,就會佔用作業系統記憶體空間,建議你別宣告三維陣列

7樓:匿名使用者

就把譚浩強那本書高透了 基礎打好了就好說了

比如最基礎的 陣列 符號 遞迴 迴圈 等最基礎的東西打牢.

c語言 怎麼寫 可變 引數函式

8樓:匿名使用者

#include //可變引數襲函bai數必要的du標頭檔案#include

long int sum(unsigned int argc,...)    //可變引數函式必須包含至少一個確定的引數

{zhilong int srt=0;

int va;

unsigned int i;

va_list vl;                        //用於指向可dao變引數列表

va_start(vl,argc);                 //初始化,va_start()呼叫的第一個引數是所編寫的可變引數函式的最後一個確定的引數

for (i = 0; i

9樓:匿名使用者

許多程式設計語言中,可以將一段經常需要使用的**封裝起來,在需要使用回時可以直接呼叫,答這就是程式中的函式。如c語言中:

int max(int x,int y)

就是一段比較兩數大小的函式,函式有引數與返回值。c++程式設計中的函式可以分為兩類:帶引數的函式和不帶引數的函式。這兩種引數的宣告、定義也不一樣。

帶有(一個)引數的函式的宣告:

型別名標示符+函式名+(型別標示符+引數)不帶引數的函式的宣告:

void+函式名( )

花括號內為函式體。

帶引數的函式有返回值,不帶引數的沒有返回值。

c++中函式的呼叫:函式必須宣告後才可以被呼叫。呼叫格式為:

函式名(實參)呼叫時函式名後的小括號中的實參必須和宣告函式時的函式括號中的形參個數相同。有返回值的函式可以進行計算,也可以做為右值進行賦值。

c語言中的部分函式:

main(主函式)

max(求最大數的函式)

scanf(輸入函式)

printf(輸出函式)

韋宵汨助休鑄琯版泫哎維底香戈速燮純坐焜嵋服

c語言如何封裝一個帶有可變引數的方法?

10樓:匿名使用者

需要借用c語言的va_list 巨集定義,及相關操作來實現可變引數。

va_list 所在標頭檔案:#include ,用法如下:

(1)首先在函式裡定義一具va_list型的變數,這個變數是指向引數的指標;

(2)然後用va_start巨集初始化剛定義的va_list變數;

(3)然後用va_arg返回可變的引數,va_arg的第二個引數是你要返回的引數的型別(如果函式有多個可變引數的,依次呼叫va_arg獲取各個引數);

(4)最後用va_end巨集結束可變引數的獲取。

以下是一個自定義列印介面的實現:

int my_printf(const char *fmt, ...)//...表示引數可變

11樓:匿名使用者

第一,c裡沒有方法,只有函式

第二,可以使用vsprintf來代替sprintf

12樓:安藤沙耶香

因為va_start, va_arg, va_end等定義成巨集,所以它顯得很愚蠢, 可變引數的型別和個數完全在該函式中由程式**控制,它並不能智慧地識別不同引數的個數和型別。

有人會問:那麼printf中不是實現了智慧識別引數嗎?那是因為函式printf()是從固定引數format字串來分析出引數的型別,再呼叫va_arg的來獲取可變引數的。

也就是說,你想實現智慧識別可變引數的話是要通過在自己的程式裡作判斷來實現的。

另外有一個問題,因為編譯器對可變引數的函式的原型檢查不夠嚴格,對程式設計查錯不利。如果******_va_fun()改為:

c語言 怎麼寫 可變 引數函式,c語言如何定義一個可變引數函式 如何呼叫其輸入的引數 分別

include 可變引數襲函bai數必要的du標頭檔案 include long int sum unsigned int argc,可變引數函式必須包含至少一個確定的引數 zhilong int srt 0 int va unsigned int i va list vl 用於指向可dao變引數列...

c語言巨集定義裡帶引數是什麼意思,在C語言中 巨集 是什麼意思?

c的巨集可以用來替換常數,替換表示式,仔細把這個程式看完你就明白了,include int main 程式輸入4 輸出25 比如 define max a,b a b a b 格式 define巨集名 參數列 字串 例如 define s a,b a b area s 3,2 第一步被換為area ...

c語言全域性變數的定義,C語言中如何定義全域性變數

在所有函式外部定義的變數稱為全域性變數 global variable 它的作用域預設是整個程式,也就是所有的原始檔,包括 c 和 h 檔案。例如 int a,b 全域性變數 void func1 todo float x,y 全域性變數 int func2 todo int main todo r...