經典企業面試題(ti)整理(C語(yu)言),讓你不再發愁
時間:2018-08-06 來源(yuan):未知
1. C語言有多少關(guan)鍵(jian)字?
32個,注意sizeof是關鍵字,不是函數(shu)。
2. C程序(xu)的一(yi)般結構那 些?
順序,分支(zhi),循環
3. 簡單(dan)列舉幾種常用(yong)的循(xun)環(huan)結構(gou)和分支結構(gou)。
循環:For,while do,if goto(慎用)。分支:if else, switch case(注(zhu)意default 的使用,和(he)break 的添加)。
4. while 和dowhile 有何區別?
前(qian)者先判斷(duan)再(zai)執行,后者先執行再(zai)判斷(duan);后者比前(qian)者多執行一(yi)次。
5. continue 和(he) break 有何需別?
前者結束本次循環繼續下(xia)次循環,后者直接推出循環。
6. register 有(you)何作(zuo)用?
聲明一(yi)個變量常駐寄(ji)存器(qi),以(yi)達到提高程(cheng)序運行效(xiao)率(lv)的目(mu)的,在嵌(qian)入式開(kai)發(fa)中(zhong)尤其(qi)常用,但它(ta)是(shi)一(yi)個建議性的聲明,編譯器(qi)會(hui)根據程(cheng)序情況決定是(shi)否申請成(cheng)功。
7. static 有(you)何(he)作用?
兩(liang)方面:1)限(xian)定(ding)(ding)存儲域;2)限(xian)定(ding)(ding)作(zuo)用域。
8. volatile關鍵字有什么(me)用(yong)途?
聲明(ming)為一(yi)個異變的(de)變量,一(yi)般(ban)的(de)變量會暫存(cun)在處(chu)(chu)理器的(de)緩存(cun)區中,當內存(cun)中變量發生改變時(shi)處(chu)(chu)理器可能無法及時(shi)更新(xin)其變量的(de)值(zhi)導致災難(nan),在嵌入(ru)式開(kai)發中尤其重要,也可達(da)到防止編譯器優化的(de)目的(de)。
9. 指針函數和函數指針有和區別?
概念不(bu)同,前(qian)者是一個函(han)數返回值為指針類(lei)型;后者為一個指針,指向(xiang)一個函(han)數入口地(di)址。
10. 簡(jian)述0,'0',"0",'\0'的(de)區別。
分別為數(shu)(shu)值0,字(zi)(zi)符(fu)(fu)(fu)0(ascii碼數(shu)(shu)值為48),字(zi)(zi)符(fu)(fu)(fu)串0(占兩個(ge)字(zi)(zi)節,有‘\0’作為結(jie)束(shu)符(fu)(fu)(fu)),字(zi)(zi)符(fu)(fu)(fu)串結(jie)束(shu)標志(其數(shu)(shu)值等(deng)于0是絕對的0,但意(yi)義不(bu)同)
11. 使用gets時應注意哪些事項?
防止越界(jie),gets不檢查(cha)目的(de)地址的(de)空間(jian)大(da)小。
12. 簡述堆和棧的區別:
前者為程序動(dong)態分配,創建和銷毀都(dou)需要(yao)手動(dong)完成(使用(yong)完一定要(yao)銷毀,防止內存泄露);后(hou)者為系統(tong)自動(dong)分配,在函數返(fan)回時自動(dong)銷毀(所以不(bu)能在函數中返(fan)回變(bian)量)。
13. 函數傳參有哪些方法?各有何特色(se)?
值傳(chuan)遞和(he)地址傳(chuan)遞,前者(zhe)在傳(chuan)遞時函數形參接受實參的拷(kao)貝(bei)(bei),所(suo)以(yi)原(yuan)形參不(bu)會(hui)被(bei)改變(但是大數據的拷(kao)貝(bei)(bei)會(hui)降低(di)效率(lv));后者(zhe)傳(chuan)遞變量(liang)的地址,不(bu)需(xu)拷(kao)貝(bei)(bei),但是會(hui)改變參數的值。
14. 全(quan)局變量和局部(bu)變量有何區別(bie)?
前者在(zai)靜(jing)態區,作(zuo)用域是整個程序;后者在(zai)棧區,作(zuo)用域僅限于函數(shu)內(nei)部。
15. 局(ju)部(bu)變(bian)量能(neng)否(fou)和全局(ju)變(bian)量重名?
可以,局(ju)部變量會屏蔽全局(ju)變量。
16. 靜態全局變量和普(pu)通全局變量有何(he)區別?
存儲域(yu)(yu)方(fang)面:都(dou)相同,都(dou)在靜態區;作(zuo)用域(yu)(yu)方(fang)面:不同,前者是本文件,后者是全局可見。
17. 靜態局(ju)部變(bian)量和普通局(ju)部變(bian)量有何區別?
存儲域:相(xiang)同(tong),都在靜態去;作用域:相(xiang)同(tong),都在函數內部;
但(dan)是聲明(ming)周(zhou)期(qi)不同,前者聲明(ming)周(zhou)期(qi)為整個(ge)程(cheng)序(xu)的聲明(ming)周(zhou)期(qi)知道(dao)程(cheng)序(xu)推出自動消(xiao)亡;后者聲明(ming)周(zhou)期(qi)為一次函數調用,函數返回即銷毀。
18.地址(zhi)對(dui)齊方式(shi)有哪(na)幾種(zhong)?
字(zi)(zi)節對齊,半字(zi)(zi)對齊,字(zi)(zi)對齊
19.
Struct a{
Char a;
Int b;
Short c;
}
Sizeof(a) = ?
結(jie)構(gou)體a的(de)大(da)(da)小是4*3=12個字(zi)節,而不是1+2+4=7個字(zi)節;這里(li)主要考察內存(cun)對(dui)齊(qi)(qi)(地址(zhi)對(dui)齊(qi)(qi))的(de)特點,應為結(jie)構(gou)體中最大(da)(da)數據寬(kuan)度是整型(4字(zi)節),所以按(an)字(zi)對(dui)齊(qi)(qi)。
思(si)考一下如何改良結構使(shi)得存(cun)儲(chu)空間變小。
20. 簡(jian)述(shu)程序的局(ju)部變(bian)量存(cun)(cun)在(zai)于(棧區)中,全(quan)局(ju)變(bian)量存(cun)(cun)在(zai)于(靜(jing)態區 )中,動態申請數(shu)據存(cun)(cun)在(zai)于( 堆區)中。
21.結構體和聯合體的區(qu)別?
22. 宏函(han)(han)數與內聯函(han)(han)數和普通函(han)(han)數的(de)執行效率的(de)比(bi):
宏函數效率高,因為是編譯器在預處理階段的替換(huan);
23.C語(yu)言中(zhong)注釋有哪些方法?
/**/和 #if 0 #endif 。后者(zhe)是預處理命令,可(ke)以方便的(de)對代碼(ma)區進行選(xuan)擇編譯(yi)。
解釋一下語句的含義:
Const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前兩個(ge)(ge)的(de)(de)(de)(de)(de)作(zuo)用(yong)是(shi)(shi)一(yi)(yi)樣,a是(shi)(shi)一(yi)(yi)個(ge)(ge)常(chang)整(zheng)(zheng)(zheng)型(xing)(xing)(xing)數(shu)(shu)(shu)。第三個(ge)(ge)意味著a是(shi)(shi)一(yi)(yi)個(ge)(ge)指(zhi)(zhi)向常(chang)整(zheng)(zheng)(zheng)型(xing)(xing)(xing)數(shu)(shu)(shu)的(de)(de)(de)(de)(de)指(zhi)(zhi)針(也(ye)(ye)就(jiu)是(shi)(shi),整(zheng)(zheng)(zheng)型(xing)(xing)(xing)數(shu)(shu)(shu)是(shi)(shi)不(bu)(bu)可(ke)修(xiu)改的(de)(de)(de)(de)(de),但指(zhi)(zhi)針可(ke)以)。第四個(ge)(ge)意思a是(shi)(shi)一(yi)(yi)個(ge)(ge)指(zhi)(zhi)向整(zheng)(zheng)(zheng)型(xing)(xing)(xing)數(shu)(shu)(shu)的(de)(de)(de)(de)(de)常(chang)指(zhi)(zhi)針(也(ye)(ye)就(jiu)是(shi)(shi)說,指(zhi)(zhi)針指(zhi)(zhi)向的(de)(de)(de)(de)(de)整(zheng)(zheng)(zheng)型(xing)(xing)(xing)數(shu)(shu)(shu)是(shi)(shi)可(ke)以修(xiu)改的(de)(de)(de)(de)(de),但指(zhi)(zhi)針是(shi)(shi)不(bu)(bu)可(ke)修(xiu)改的(de)(de)(de)(de)(de))。最后(hou)一(yi)(yi)個(ge)(ge)意味著a是(shi)(shi)一(yi)(yi)個(ge)(ge)指(zhi)(zhi)向常(chang)整(zheng)(zheng)(zheng)型(xing)(xing)(xing)數(shu)(shu)(shu)的(de)(de)(de)(de)(de)常(chang)指(zhi)(zhi)針(也(ye)(ye)就(jiu)是(shi)(shi)說,指(zhi)(zhi)針指(zhi)(zhi)向的(de)(de)(de)(de)(de)整(zheng)(zheng)(zheng)型(xing)(xing)(xing)數(shu)(shu)(shu)是(shi)(shi)不(bu)(bu)可(ke)修(xiu)改的(de)(de)(de)(de)(de),同時指(zhi)(zhi)針也(ye)(ye)是(shi)(shi)不(bu)(bu)可(ke)修(xiu)改的(de)(de)(de)(de)(de))。如(ru)果(guo)應(ying)試者能(neng)正確(que)回(hui)答這些問題(ti),那(nei)么他就(jiu)給(gei)我留下(xia)了一(yi)(yi)個(ge)(ge)好印象。順帶提一(yi)(yi)句,也(ye)(ye)許你可(ke)能(neng)會問,即(ji)使不(bu)(bu)用(yong)關鍵字const,也(ye)(ye)還是(shi)(shi)能(neng)很容易寫出功(gong)能(neng)正確(que)的(de)(de)(de)(de)(de)程序,那(nei)么我為(wei)什(shen)么還要(yao)如(ru)此看(kan)重關鍵字const呢?我也(ye)(ye)如(ru)下(xia)的(de)(de)(de)(de)(de)幾下(xia)理(li)由(you):
1). 關鍵(jian)字const的(de)(de)(de)(de)作用(yong)是(shi)為給讀你代碼的(de)(de)(de)(de)人(ren)傳達非常有用(yong)的(de)(de)(de)(de)信息,實(shi)際上,聲(sheng)明一個參數(shu)為常量是(shi)為了(le)告訴了(le)用(yong)戶(hu)這(zhe)個參數(shu)的(de)(de)(de)(de)應(ying)用(yong)目的(de)(de)(de)(de)。如(ru)果你曾花很多(duo)時間清理其它人(ren)留下的(de)(de)(de)(de)垃(la)圾,你就(jiu)會很快學會感謝這(zhe)點多(duo)余的(de)(de)(de)(de)信息。(當然(ran),懂得用(yong)const的(de)(de)(de)(de)程(cheng)序員很少會留下的(de)(de)(de)(de)垃(la)圾讓別(bie)人(ren)來清理的(de)(de)(de)(de)。)
2). 通過(guo)給優化(hua)器一(yi)些附加的(de)信息,使(shi)用關鍵字const也許能產生更緊(jin)湊的(de)代碼(ma)。
3). 合理地使用關鍵字const可(ke)以(yi)使編譯器很(hen)自然地保護那些不希(xi)望被改(gai)變的參(can)數(shu),防(fang)止其被無(wu)意的代碼(ma)修(xiu)改(gai)。簡而言之,這樣可(ke)以(yi)減(jian)少bug的出現。
24.
int * a;
*a = 2;
上式有錯(cuo)嗎(ma),錯(cuo)到哪里?(指針沒(mei)有初始化)
25、頭文件中(zhong)的 ifndef/define/endif 干什么用(yong)?(5分)
答(da):防止該(gai)頭(tou)文件被(bei)重復引用。
26、#include
答:對于#include
對(dui)于#include “filename.h” ,編譯(yi)器從用(yong)戶的工作路徑開始搜(sou)索 filename.h

