C語言面試題 函式(二)

2021-08-14 00:21:34 字數 2560 閱讀 5486

c語言面試題----函式(二)

c語言中,跟函式相關的考題,偶爾還會出現與變長引數相關的問題。

在c語言程式設計中有時會遇到一些引數個數可變的函式,例如 printf(),scanf()  函式,

檢視man手冊時其函式原型為:

int printf(const char* format,…);

int scanf(const char *format,…);

它除了有乙個引數format固定以外,後面跟著的引數的個數和型別是可變的(用三個點「…」做引數

佔位符),實際呼叫時可以有以下的形式:

printf(「%d」,i);

printf(「%d,%c」,i,j);

這就是所謂引數可變的函式。

c語言用 va_start  等巨集來處理這些可變引數。這些巨集看起來很複雜,其實原理挺簡單,

就是根據引數入棧的特點從最靠近第乙個可變引數的固定引數開始,依次獲取每個可變引數的位址。

在標準c語言中定義了乙個標頭檔案 專門用來對付可變引數列表,它

包含了一組巨集,

乙個 va_list  的 typedef  宣告。來看乙個例子:

# include # include # include void  test( int num ,...);

int main()

void test( int num,...)

va_end(ap);

}

35203在本例中,首先包含了 標頭檔案,處理不定長引數的巨集全部定義在這裡面,所以用到可變引數的程式應該包含這個標頭檔案.然後宣告了不定長引數函式 test()  ,這里需要注意的是,所以為的不定長引數列列表,

只是指 ...  代表的部分,前面的 int num  不屬於不定長引數列表。

然後在函式中,首先定義了 va_list  型別的 ap  ,這個變數是指向引數位址的指標.

因為得到引數的位址之後,再結合引數的型別,才能得到引數的值。

再然後用 va_start  巨集初始化上一步中定義的變量 ap  ,這個巨集的第二個引數是可變

引數列表的前乙個引數,也就是最後乙個固定引數。在本例中就是 int num  。

然後依次用 va_arg  巨集使 ap  返回可變引數的位址,得到這個位址之後,結合引數的型別,

就可以得到引數的值。然後進行輸出。

<1>原型:  void va_start(va_list arg_ptr,prev_param);

返回值:無<2>原型: va_list  型別的變數, va_list ap  ,這個變數是指向引數位址的指標,

因為得到引數的位址之後,再結合引數的型別,才能得到引數的值。

<3>原型: type va_arg(va_list arg_ptr,type);

返回值:根據傳入引數型別決定返回值型別

<4>原型: void va_end(va_list arg_ptr);

功能:將arg_ptr指標置0

返回值:無

C語言面試題 函式(一)

函式部分在面試中的考察重點主要是幾個關鍵字的使用,如static const,這些我們在前文中已 經有過專題,因此在這 就 再繼續贅述,主要來看一下,關於函式自身的幾個問題 分析下面的程式,程式能否給出運 結果,如果能輸出是 麼,如果 能,原因是什麼 include int m,n ps1 ps2 ...

C語言面試題

基礎篇 1 區域性變數能否和全域性變數重名?可以2 如何引用乙個已經定義過的全域性變數?直接呼叫並初始化 3 全域性變數可不可以定義在可被多個.c檔案包含的標頭檔案中?為什麼?可以,6 堆和棧有什麼區別?7 什麼是預編譯,何時需要預編譯 8 c和c 中的struct有什麼不同?9 memset me...

C語言面試題

1.求某一年的某一天 includestruct sdate int main int i 0,nday dt.nday while i2 nday printf 這是 d年的第 d天 n dt.nyear,dt.nday return 0 將列印和演算法抽象成不同函式 includestruct ...