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