當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式招聘 > 嵌入式面試題 > 經(jīng)典企業(yè)面試題整理(C語言),讓你不再發(fā)愁
1. C語言有多少關(guān)鍵字?
32個,注意sizeof是關(guān)鍵字,不是函數(shù)。
2. C程序的一般結(jié)構(gòu)那 些?
順序,分支,循環(huán)
3. 簡單列舉幾種常用的循環(huán)結(jié)構(gòu)和分支結(jié)構(gòu)。
循環(huán):For,while do,if goto(慎用)。分支:if else, switch case(注意default 的使用,和break 的添加)。
4. while 和dowhile 有何區(qū)別?
前者先判斷再執(zhí)行,后者先執(zhí)行再判斷;后者比前者多執(zhí)行一次。
5. continue 和 break 有何需別?
前者結(jié)束本次循環(huán)繼續(xù)下次循環(huán),后者直接推出循環(huán)。
6. register 有何作用?
聲明一個變量常駐寄存器,以達(dá)到提高程序運(yùn)行效率的目的,在嵌入式開發(fā)中尤其常用,但它是一個建議性的聲明,編譯器會根據(jù)程序情況決定是否申請成功。
7. static 有何作用?
兩方面:1)限定存儲域;2)限定作用域。
8. volatile關(guān)鍵字有什么用途?
聲明為一個異變的變量,一般的變量會暫存在處理器的緩存區(qū)中,當(dāng)內(nèi)存中變量發(fā)生改變時處理器可能無法及時更新其變量的值導(dǎo)致災(zāi)難,在嵌入式開發(fā)中尤其重要,也可達(dá)到防止編譯器優(yōu)化的目的。
9. 指針函數(shù)和函數(shù)指針有和區(qū)別?
概念不同,前者是一個函數(shù)返回值為指針類型;后者為一個指針,指向一個函數(shù)入口地址。
10. 簡述0,'0',"0",'\0'的區(qū)別。
分別為數(shù)值0,字符0(ascii碼數(shù)值為48),字符串0(占兩個字節(jié),有‘\0’作為結(jié)束符),字符串結(jié)束標(biāo)志(其數(shù)值等于0是絕對的0,但意義不同)
11. 使用gets時應(yīng)注意哪些事項(xiàng)?
防止越界,gets不檢查目的地址的空間大小。
12. 簡述堆和棧的區(qū)別:
前者為程序動態(tài)分配,創(chuàng)建和銷毀都需要手動完成(使用完一定要銷毀,防止內(nèi)存泄露);后者為系統(tǒng)自動分配,在函數(shù)返回時自動銷毀(所以不能在函數(shù)中返回變量)。
13. 函數(shù)傳參有哪些方法?各有何特色?
值傳遞和地址傳遞,前者在傳遞時函數(shù)形參接受實(shí)參的拷貝,所以原形參不會被改變(但是大數(shù)據(jù)的拷貝會降低效率);后者傳遞變量的地址,不需拷貝,但是會改變參數(shù)的值。
14. 全局變量和局部變量有何區(qū)別?
前者在靜態(tài)區(qū),作用域是整個程序;后者在棧區(qū),作用域僅限于函數(shù)內(nèi)部。
15. 局部變量能否和全局變量重名?
可以,局部變量會屏蔽全局變量。
16. 靜態(tài)全局變量和普通全局變量有何區(qū)別?
存儲域方面:都相同,都在靜態(tài)區(qū);作用域方面:不同,前者是本文件,后者是全局可見。
17. 靜態(tài)局部變量和普通局部變量有何區(qū)別?
存儲域:相同,都在靜態(tài)去;作用域:相同,都在函數(shù)內(nèi)部;
但是聲明周期不同,前者聲明周期為整個程序的聲明周期知道程序推出自動消亡;后者聲明周期為一次函數(shù)調(diào)用,函數(shù)返回即銷毀。
18.地址對齊方式有哪幾種?
字節(jié)對齊,半字對齊,字對齊
19.
Struct a{
Char a;
Int b;
Short c;
}
Sizeof(a) = ?
結(jié)構(gòu)體a的大小是4*3=12個字節(jié),而不是1+2+4=7個字節(jié);這里主要考察內(nèi)存對齊(地址對齊)的特點(diǎn),應(yīng)為結(jié)構(gòu)體中最大數(shù)據(jù)寬度是整型(4字節(jié)),所以按字對齊。
思考一下如何改良結(jié)構(gòu)使得存儲空間變小。
20. 簡述程序的局部變量存在于(棧區(qū))中,全局變量存在于(靜態(tài)區(qū) )中,動態(tài)申請數(shù)據(jù)存在于( 堆區(qū))中。
21.結(jié)構(gòu)體和聯(lián)合體的區(qū)別?
22. 宏函數(shù)與內(nèi)聯(lián)函數(shù)和普通函數(shù)的執(zhí)行效率的比:
宏函數(shù)效率高,因?yàn)槭蔷幾g器在預(yù)處理階段的替換;
23.C語言中注釋有哪些方法?
/**/和 #if 0 #endif 。后者是預(yù)處理命令,可以方便的對代碼區(qū)進(jìn)行選擇編譯。
解釋一下語句的含義:
Const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前兩個的作用是一樣,a是一個常整型數(shù)。第三個意味著a是一個指向常整型數(shù)的指針(也就是,整型數(shù)是不可修改的,但指針可以)。第四個意思a是一個指向整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是可以修改的,但指針是不可修改的)。最后一個意味著a是一個指向常整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是不可修改的,同時指針也是不可修改的)。如果應(yīng)試者能正確回答這些問題,那么他就給我留下了一個好印象。順帶提一句,也許你可能會問,即使不用關(guān)鍵字const,也還是能很容易寫出功能正確的程序,那么我為什么還要如此看重關(guān)鍵字const呢?我也如下的幾下理由:
1). 關(guān)鍵字const的作用是為給讀你代碼的人傳達(dá)非常有用的信息,實(shí)際上,聲明一個參數(shù)為常量是為了告訴了用戶這個參數(shù)的應(yīng)用目的。如果你曾花很多時間清理其它人留下的垃圾,你就會很快學(xué)會感謝這點(diǎn)多余的信息。(當(dāng)然,懂得用const的程序員很少會留下的垃圾讓別人來清理的。)
2). 通過給優(yōu)化器一些附加的信息,使用關(guān)鍵字const也許能產(chǎn)生更緊湊的代碼。
3). 合理地使用關(guān)鍵字const可以使編譯器很自然地保護(hù)那些不希望被改變的參數(shù),防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現(xiàn)。
24.
int * a;
*a = 2;
上式有錯嗎,錯到哪里?(指針沒有初始化)
25、頭文件中的 ifndef/define/endif 干什么用?(5分)
答:防止該頭文件被重復(fù)引用。
26、#include
答:對于#include
對于#include “filename.h” ,編譯器從用戶的工作路徑開始搜索 filename.h