①字符串
1、strlen()函數的返回值是什麽類型的?
2、字符串strlen() 的值,是否和他占據的內存空間相同?
3、妳是否知道strcpy 函數存在的潛在風險?如何避免?
4、如果壹個字符串沒有字符串結束符,而調用str 開頭的庫函數,會發生什麽?
5、Strcpy(),strcat(),strcmp(),strncpy(),strncat(),strncmp()內部到底是如何運行的?這些函數到底對源字符串和目標字符串做了些什麽?妳是否觀察過它們運行時兩個字符串內存的變化?
6、上面這些函數使用時,各有哪些需要註意的地方?
7、妳會幾種字符串查找操作?
8、c語言中有字符串這個數據類型嗎?
9、對字符串進行操作的時候,是否為字符串結尾符預留存儲位置?不然的話容易造成非常訪問內存。
二、數組
1、妳肯定知道,定義“int a[10]; ”, a[10] 這個元素是無效的。
2、妳知道幾種數組初始化的方法?
3、數組和指針有千絲萬縷的聯系而又不同,妳是否對他們在不同情況下的使用進行過詳細的總結?
4、“int calendar[10][20]; ”,這是壹個什麽樣的數組?它擁有 10 數組類型的元素,還是 20 個?
5、“int a[10]; ”,數組名 a 在本質上是壹個什麽?妳是否打印過 a 的值?
6、妳知道幾種獲取數組某元素的方法?
7、指針和數組相同嗎?什麽時候相同?什麽時候不同?
8、用指針和下標訪問數組元素,那種方式更快?
三、結構體
1、妳知道什麽是位域結構體嗎?如何定義它?如何使用它?
2、妳知道字節對齊對結構體占用內存空間大小的影響嗎?如何計算結構體占用內存的大小?
四、宏
1、妳知道宏的本質是什麽嗎?函數?語句?類型定義?或者其他?
2、妳知道語言設計者為什麽設計宏嗎?這些原因目前是否仍然成立?
3、妳會設計帶有參數的宏嗎?
4、妳知道使用宏的參數的的時候的註意事項嗎?
5、妳會設計帶有可變參數的宏嗎?
6、妳知道使用宏有什麽劣勢嗎?
7、妳有沒有更好的替代方案?
五、枚舉
1、是否可以指定枚舉中各項的值?
2、如果不指定值,枚舉的第壹個值是多少?
3、枚舉的值是否可以是負數?
4、定義枚舉的時候,妳是否專門定義了枚舉的最小值和最大值?
六、switch
1、switch?中的 c 的數據類型有哪些?
2、妳是否在所有的switch 中都加了 default 語句?
3、是否在所有的case 中都加了 break 語句(壹般情況的做法)?如果妳不加 break ,將會發生什麽?
七、static
1、static的三個主要作用是什麽?
2、static的修飾的局部變量是保存在什麽地方的?全局變量哪 ?
3、static修飾的全局變量和函數,在其他的文件中是否可以訪問?如何訪問?
4、妳知道static 是 c 語言中實現封裝和隱藏的利器嗎?妳是否經常使用?
5、定義在不同源文件中的static 全局變量,編譯器是否允許他們的變量名稱相同?他們在內存中的地址是否相同?函數那?
八、const
1、妳是否經常使用const 來表明不能夠被更改的變量?
2、妳是否經常使用const 常量來代替宏?
3、下面四種情況,妳知道是各表示什麽意思嗎?
int i_value= 10;
const int* pvalue = & i_value
int const *pvalue = & i_value
int* const pvalue=& i_value
const int* const pvalue =& i_value
4、妳知道const 常量如何初始化嗎?
九、sizeof
1、對於字符數組,strlen 和 sizeof 的值是否相同?
2、S izeof本質上是函數還是宏?
3、S izeof的返回值是什麽類型?
十、指針
1、“int *p; ” &p , p , *p 他們的值分別表示什麽含義?
2、妳定義的指針初始化了沒?
3、妳理解指針的指針的概念嗎?妳會使用嗎?
4、“int *pi_value; pi_value = 0x100000; ” pi_value + 1 的值是是多少?
5、妳會定義函數指針嗎?
6、妳會使用函數指針調用函數嗎?
7、關於指針和數組,請參見知識點數組。
十壹、動態分配內存
1、動態分配的內存是保存在什麽地方的?
2、什麽情況下使用動態分配內存?
3、動態申請內存壹定要釋放,否則會內存泄露。妳是否使用過內存檢測工具?
十二、函數
1、如何查看函數在內存中的地址?
2、如何給壹個函數指針賦值?
3、妳是否會定義可變入參函數
4、妳是否可以區分函數的形參與實參?
5、如何定義函數名,以準確的表達函數的用途?
6、妳是否使用const 來修飾函數入參和返回值,以表的特定的含義?
7、遞歸如何使用?
十三、變量
1、全局變量,局部變量,常量分別保存在內存中的什麽地方?
2、不同類型的變量,妳是否知道其作用域?
3、全局變量和局部變量是否可以重名?妳是否在這樣做?
4、局部變量在函數退出後是否有效,為什麽?
5、全局變量為什麽不允許定義在頭文件中?有何危害?
十四、連接(Linux)
1、鏈接位於編譯過程的那個階段?
2、動態鏈接庫和靜態鏈接庫使用時有何區別?
3、如何 對 動態鏈接庫 進行 動態加載 (不用重啟程序而加載鏈接庫)?
4、動態鏈接有何優點?
5、動態鏈接庫中是否定義了非static 的全局變量?妳是否知道這是壹個非常危險的動作?
6、動態庫中的全局變量(非static )和函數(非 static )是否可以和上層全局變量和函數重名?重名後會發生什麽事情?
十五、運行時的數據結構(Linux)
1、妳知道什麽是段的概念嗎?
2、可執行程序可以分為幾個段?每個段保存的是什麽內容?
3、如何查看可執行程序各個段的大小?
4、當函數被調用時發生了什麽?
5、妳有沒有試過程序的棧空間最大有多大?程序超過此大小會發生什麽?
6、妳使用的系統的棧是向下生長的,還是向上生長的?
十六、Include
1、如何避免對同壹頭文件的多次include ?
十七、聲明
1、什麽是 聲明 ,什麽是定義?
2、妳是否會運用c 語言聲明的優先級規則?
十八、關於 復雜度 :
1、軟件的首要技術使命 是 管理復雜度。
2、優秀程序員的 壹個特質 是將復雜的事情簡單化,而非將簡單的問題復雜化。所以,他們壹般會選擇簡單的解決方案。
3、極盡機巧,復雜的解決方案,除了將新手搞得暈頭轉向之外,別無他用。
4、閱讀優秀程序員的代碼,是壹種享受,妳很少遇到思維的阻力,妳可以盡情的享受簡單之美。