C語言常見面試試題

2021-12-23 15:28:03 字數 3698 閱讀 4403

1)下面的測試題中,認為所有必須的標頭檔案都已經正確的包含了

2)資料型別

char乙個位元組1byte

int兩個位元組2byte(16位系統,認為整型是2個位元組)

longint四個位元組4byte

float四個位元組4byet

double八個位元組8byte

longdouble十個位元組10byte

pointer兩個位元組2byte(注意,16位系統,位址匯流排只有16位)

第1題:考查對volatile關鍵字的認識

#include <>

staticjmp_bufbuf;

main()

b=5;

longjmp(buf,1);

} 請問,這段程式的輸出是

(a)3

(b)5

(c)0

(d)以上均不是

第1題:(b)

volatile字面意思是易於揮發的。這個關鍵字來描述乙個變數時,意味著給該變數賦值(寫入)之後,馬上再讀取,寫入的值與讀取的值可能不一樣,所以說它"容易揮發"的。

這是因為這個變數可能乙個暫存器,直接與外部裝置相連,你寫入之後,該暫存器也有可能被外部裝置的寫操作所改變;或者,該變數被乙個中斷程式,或另乙個程序

改變了.

volatile不會被編譯器優化影響,在longjump後,它的值是後面假定的變數值,b最後的值是5,所以5被列印出來.

setjmp:設定非區域性跳轉/*

.returns0whenitisinitiallycalled.

lonjjmp:執行乙個非區域性跳轉/*

(whichinitializedbuf)wasmade...whenyouusesetjmpandlongjmp,.

note:testprogramwithoutvolatilequalifier(resultmayvery)

更詳細介紹,請參閱c語言的setjmp和longjmp

第2題:考查型別轉換

main()

; structnodes=;

structnode*pt=&s;

printf("%d",*(int*)pt);

} 這段程式的輸出是:

(a)3

(b)5

(c)6

(d)7

第2題:(a)

結構題的成員在記憶體中的位址是按照他們定義的位置順序依次增長的。如果乙個結構體的指標被看成它的第乙個成員的指標,那麼該指標的確指向第乙個成員

第5題:考查多維陣列與指標

voidfoo(int[3]);

main()

,,};

foo(a);

printf("%d",a[2][1]);

} voidfoo(intb[3])

這段程式的輸出是:

(a)8

(b)9

(c)7

(d)以上均不對

第5題:(b)

題目自身就給了足夠的提示

b[0][0]=4

b[1][0]=7

第6題目:考查逗號表示式

main()

這段程式的輸出是:

(a)c=3d=3

(b)c=5d=3

(c)c=3d=5

(d)c=5d=5

第6題:(c)

考查逗號表示式,逗號表示式的優先順序是很低的,比賦值(=)的優先順序低.逗號表示式的值就是最後乙個元素的值

逗號表示式的還有乙個作用就是分割函式的引數列表..

e1,e2,...,en

上面這個表示式的左右是,e1,e2,...en的值被分別計算出來,en計算出來的結構賦給整個逗號表示式

c=a,b;/*yieldsc=a*/

d=(a,b);/*d=b*/

第7題:考查指標陣列

main()

; int(*ptr)[3]=a;

printf("%d%d",(*ptr)[1],(*ptr)[2]);

++ptr;

printf("%d%d",(*ptr)[1],(*ptr)[2]);

} 這段程式的輸出是:

(a)2356

(b)2345

(c)4500

(d)以上均不對

第7題:(a)

ptr是乙個陣列的指標,該陣列有3個int成員

第8題:考查函式指標

int*f1(void)

int*f2(void)

int*f3(void)

上面這3個函式哪乙個最可能引起指標方面的問題

(a)只有f3

(b)只有f1andf3

(c)只有f1andf2

(d)f1,f2,f3

第8題:(c)

f1顯然有問題,它返回乙個區域性變數的指標,區域性變數是儲存在stack中的,退出函式後,區域性變數就銷毀了,保留其指標沒有意義,因為其指向的stack空間可能被其他變數覆蓋了

f2也有問題,ptr是區域性變數,未初始化,它的值是未知的,*ptr不知道指向**了,直接給*ptr賦值可能會覆蓋重要的系統變數,這就是通常說的野指標的一種.

f3函式的目的,是取得分配空間的起始位址,ptr是釋放了,但位址的值已經傳給返回引數了。

第9題:考查自加操作(++)

main()

這段程式的輸出是:

(a)i=4j=2

(b)i=3j=2

(c)i=3j=4

(d)i=3j=6

第9題:(b)

sizeof操作符給出其運算元需要占用的空間大小,它是在編譯時就可確定的,所以其運算元即使是乙個表示式,也不需要在執行時進行計算.(++i+++i)是不會執行的,所以i的值還是3

第11題:考查自減操作(--)

voide(int);

main()

voide(intn) }

這段程式的輸出是:

(a)0120

(b)0121

(c)1201

(d)0211

第11題:(a)

考查--操作和遞迴呼叫,仔細分析一下就可以了

第12題:考查typedef型別定義,函式指標

typedefint(*test)(float*,float*)

testtmp;

tmp的型別是

(a)函式的指標,該函式以兩個指向浮點數(float)的指標(pointer)作為引數(arguments)

(b)整型

(c)函式的指標,該函式以兩個指向浮點數(float)的指標(pointer)作為引數(arguments),並且函式的返回值型別是整型

(d)以上都不是

第12題:(c)

建議不會的看看c專家程式設計

從左往有,遇到括號停下來,將第乙個括號裡的東西看成乙個整體。

第14題:考查指標陣列的指標

voidf(char**);

main()

; f(ar**);

} voidf(char**p)

這段程式的輸出是:

(a)ab

(b)cd

(c)ef

(d)gh

第14題:(b)

sizeof(int)的值是2,所以p+=sizeof(int)指向ar**[2],這點估計大家都沒有什麼疑問。

(p+=sizeof(int))[-1]指向ar**[1],能理解嗎,因為(p+=sizeof(int))[-1]就相當於(p+=2)[-1],也就是(p+2-1)

C語言常見面試試題

1.1,2,7,28,126請問28和126中間那個數是什麼?為什麼?第一題的答案應該是4 3 1 63 規律是n 3 1 當n為偶數0,2,4 n 3 1 當n為奇數1,3,5 答案 63 2.用兩個棧實現乙個佇列的功能?要求給出演算法和思路!設2個棧為a,b,一開始均為空.入隊 將新元素push...

C語言常見面試試題

華為1 區域性變數能否和全域性變數重名?答 能,區域性會遮蔽全域性。要用全域性變數,需要使用 區域性變數可以與全域性變數同名,在函式內引用這個變數時,會用到同名的區域性變數,而不會用到全域性變數。對於有些編譯器而言,在同乙個函式內可以定義多個同名的區域性變數,比如在兩個迴圈體內都定義乙個同名的區域性...

C語言常見面試試題

1.有結構aa,中間有cc域,比較這兩種對cc引用的不同 pp cc,pp,qq各應如何定義。a pp是指向結構aa的指標,定義為struct aa pp qq是結構aa型別的變數,定義為 struct aa qq 2.比較 union 和 struct 的不同 a 在分配空間時,union中的各個...