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 ...