字符串
學(xué)習時(shí)間:1.5W(“W”周,下同)
知識點(diǎn)checklist
strlen()函數的返回值是什么類(lèi)型的?
字符串strlen()的值,是否和他占據的內存空間相同?
你是否知道strcpy函數存在的潛在風(fēng)險?如何避免?
如果一個(gè)字符串沒(méi)有字符串結束符,而調用str開(kāi)頭的庫函數,會(huì )發(fā)生什么?
Strcpy(),strcat(),strcmp(),strncpy(),strncat(),strncmp()內部到底是如何運行的?這些函數到底對源字符串和目標字符串做了些什么?你是否觀(guān)察過(guò)它們運行時(shí)兩個(gè)字符串內存的變化?
上面這些函數使用時(shí),各有哪些需要注意的地方?
你會(huì )幾種字符串查找操作?
c語(yǔ)言中有字符串這個(gè)數據類(lèi)型嗎?
對字符串進(jìn)行操作的時(shí)候,是否為字符串結尾符預留存儲位置?不然的話(huà)容易造成非常訪(fǎng)問(wèn)內存。
數組
學(xué)習時(shí)間:2W
知識點(diǎn)checklist
你肯定知道,定義“int a[10];”,a[10]這個(gè)元素是無(wú)效的。
你知道幾種數組初始化的方法?
數組和指針有千絲萬(wàn)縷的聯(lián)系而又不同,你是否對他們在不同情況下的使用進(jìn)行過(guò)詳細的總結?
“intcalendar[10][20];”,這是一個(gè)什么樣的數組?它擁有10數組類(lèi)型的元素,還是20個(gè)?
“inta[10];”,數組名a在本質(zhì)上是一個(gè)什么?你是否打印過(guò)a的值?
你知道幾種獲取數組某元素的方法?
指針和數組相同嗎?什么時(shí)候相同?什么時(shí)候不同?
用指針和下標訪(fǎng)問(wèn)數組元素,那種方式更快?
結構體
學(xué)習時(shí)間:1W
知識點(diǎn)checklist
你知道什么是位域結構體嗎?如何定義它?如何使用它?
你知道字節對齊對結構體占用內存空間大小的影響嗎?如何計算結構體占用內存的大???
宏
學(xué)習時(shí)間:1W
知識點(diǎn)checklist
你知道宏的本質(zhì)是什么嗎?函數?語(yǔ)句?類(lèi)型定義?或者其他?
你知道語(yǔ)言設計者為什么設計宏嗎?這些原因目前是否仍然成立?
你會(huì )設計帶有參數的宏嗎?
你知道使用宏的參數的的時(shí)候的注意事項嗎?
你會(huì )設計帶有可變參數的宏嗎?
你知道使用宏有什么劣勢嗎?
你有沒(méi)有更好的替代方案?
枚舉
學(xué)習時(shí)間:0.5W
知識點(diǎn)checklist
是否可以指定枚舉中各項的值?
如果不指定值,枚舉的第一個(gè)值是多少?
枚舉的值是否可以是負數?
定義枚舉的時(shí)候,你是否專(zhuān)門(mén)定義了枚舉的最小值和最大值?
Switch
學(xué)習時(shí)間:0.5W
知識點(diǎn)checklist
switch(c)中的c的數據類(lèi)型有哪些?
你是否在所有的switch中都加了default語(yǔ)句?
是否在所有的case中都加了break語(yǔ)句(一般情況的做法)?如果你不加break,將會(huì )發(fā)生什么?
Static
學(xué)習時(shí)間:1W
知識點(diǎn)checklist
static的三個(gè)主要作用是什么?
static的修飾的局部變量是保存在什么地方的?全局變量哪?
static修飾的全局變量和函數,在其他的文件中是否可以訪(fǎng)問(wèn)?如何訪(fǎng)問(wèn)?
你知道static是c語(yǔ)言中實(shí)現封裝和隱藏的利器嗎?你是否經(jīng)常使用?
定義在不同源文件中的static全局變量,編譯器是否允許他們的變量名稱(chēng)相同?他們在內存中的地址是否相同?函數那?
const
學(xué)習時(shí)間:1W
知識點(diǎn)checklist
你是否經(jīng)常使用const來(lái)表明不能夠被更改的變量?
你是否經(jīng)常使用const常量來(lái)代替宏?
下面四種情況,你知道是各表示什么意思嗎?
int i_value= 10;
const int* pvalue =&i_value
int const *pvalue = &i_valueint* const pvalue=&i_value
const int* const pvalue = &i_value
你知道const常量如何初始化嗎?
Sizeof
學(xué)習時(shí)間:1W
知識點(diǎn)checklist
對于字符數組,strlen和sizeof的值是否相同?
Sizeof本質(zhì)上是函數還是宏?
Sizeof的返回值是什么類(lèi)型?
指針
學(xué)習時(shí)間:3W
知識點(diǎn)checklist
“int *p;”&p,p,*p他們的值分別表示什么含義?
你定義的指針初始化了沒(méi)?
你理解指針的指針的概念嗎?你會(huì )使用嗎?
“int *pi_value; pi_value = 0x100000;”pi_value + 1的值是是多少?
你會(huì )定義函數指針嗎?
你會(huì )使用函數指針調用函數嗎?
關(guān)于指針和數組,請參見(jiàn)知識點(diǎn)數組。
動(dòng)態(tài)分配內存
學(xué)習時(shí)間:1W
知識點(diǎn)checklist
動(dòng)態(tài)分配的內存是保存在什么地方的?
什么情況下使用動(dòng)態(tài)分配內存?
動(dòng)態(tài)申請內存一定要釋放,否則會(huì )內存泄露。你是否使用過(guò)內存檢測工具?
函數
學(xué)習時(shí)間:1W
知識點(diǎn)checklist
如何查看函數在內存中的地址?
如何給一個(gè)函數指針賦值?
你是否會(huì )定義可變入參函數
你是否可以區分函數的形參與實(shí)參?
如何定義函數名,以準確的表達函數的用途?
你是否使用const來(lái)修飾函數入參和返回值,以表的特定的含義?
遞歸如何使用?
變量
學(xué)習時(shí)間:1W
知識點(diǎn)checklist
全局變量,局部變量,常量分別保存在內存中的什么地方?
不同類(lèi)型的變量,你是否知道其作用域?
全局變量和局部變量是否可以重名?你是否在這樣做?
局部變量在函數退出后是否有效,為什么?
全局變量為什么不允許定義在頭文件中?有何危害?
鏈接(linux)
學(xué)習時(shí)間:1W
知識點(diǎn)checklist
鏈接位于編譯過(guò)程的那個(gè)階段?
動(dòng)態(tài)鏈接庫和靜態(tài)鏈接庫使用時(shí)有何區別?
如何對動(dòng)態(tài)鏈接庫進(jìn)行動(dòng)態(tài)加載(不用重啟程序而加載鏈接庫)?
動(dòng)態(tài)鏈接有何優(yōu)點(diǎn)?
動(dòng)態(tài)鏈接庫中是否定義了非static的全局變量?你是否知道這是一個(gè)非常危險的動(dòng)作?
動(dòng)態(tài)庫中的全局變量(非static)和函數(非static)是否可以和上層全局變量和函數重名?重名后會(huì )發(fā)生什么事情?
運行時(shí)的數據結構(linux)
學(xué)習時(shí)間:1W
知識點(diǎn)checklist
你知道什么是段的概念嗎?
可執行程序可以分為幾個(gè)段?每個(gè)段保存的是什么內容?
如何查看可執行程序各個(gè)段的大???
當函數被調用時(shí)發(fā)生了什么?
你有沒(méi)有試過(guò)程序的??臻g最大有多大?程序超過(guò)此大小會(huì )發(fā)生什么?
你使用的系統的棧是向下生長(cháng)的,還是向上生長(cháng)的?
Include
學(xué)習時(shí)間:0.5W
知識點(diǎn)checklist
1、如何避免對同一頭文件的多次include?
聲明
學(xué)習時(shí)間:1W
知識點(diǎn)checklist
什么是聲明,什么是定義?
你是否會(huì )運用c語(yǔ)言聲明的優(yōu)先級規則?
關(guān)于復雜度:
軟件的首要技術(shù)使命是管理復雜度。
優(yōu)秀程序員的一個(gè)特質(zhì)是將復雜的事情簡(jiǎn)單化,而非將簡(jiǎn)單的問(wèn)題復雜化。所以,他們一般會(huì )選擇簡(jiǎn)單的解決方案。
極盡機巧,復雜的解決方案,除了將新手搞得暈頭轉向之外,別無(wú)他用。
閱讀優(yōu)秀程序員的代碼,是一種享受,你很少遇到思維的阻力,你可以盡情的享受簡(jiǎn)單之美。
所以,對難以理解的語(yǔ)言特性,要慎用、少用,最好不用,而以簡(jiǎn)單的解決方案替代之。但是,在做這些之前,你必須對這些知識點(diǎn)理解深刻。
如果你發(fā)現有什么錯誤,請和我聯(lián)系。
如果這些知識點(diǎn)你90%以上都不知道,或者理解不深刻——我希望你可以加入DS計劃,共同學(xué)習。
如果這些知識點(diǎn)你90%以上都知道,并且理解深刻——我希望你也可以加入DS計劃,成為知識點(diǎn)專(zhuān)家,對新手進(jìn)行指導。
如果你知道的比上面列出的還要多,或者還有你認為非常重要的,建議你也分享出來(lái),對上面列舉的內容進(jìn)行優(yōu)化。
原文地址:
http://blog.csdn.net/chgaowei/archive/2009/10/27/4731498.aspxDS計劃加入方式:
1、 方式1 :加入 QQ 群: 93684322 。
2、 方式2 :加入 CSDN 群組:
DS計劃 。 一位網(wǎng)友的建議
對《C方向項目詳細計劃》的一點(diǎn)建議
作者:陳新
原文:http://hi.csdn.net/space-1568678-do-thread-id-990.html
首先自己介紹一下,我已經(jīng)工作多年,目前半管理半開(kāi)發(fā),主要使用PHP和C語(yǔ)言,對于C語(yǔ)言有過(guò)一定研究,有一些經(jīng)驗。
我很少上CSDN,雖然已經(jīng)注冊了很長(cháng)時(shí)間,今天心血來(lái)潮進(jìn)來(lái)看看,就發(fā)現了常高偉的的帖子《深入學(xué)習C語(yǔ)言知識點(diǎn)checklist——測試你掌握C的程度》,仔細看了一遍,覺(jué)得還不錯,這年頭還執著(zhù)于技術(shù)細節的人很少了,可見(jiàn)作者還是下了不少功夫的。
接著(zhù)就看到了“讀S計劃”,覺(jué)得有點(diǎn)意思,看完之后就有了寫(xiě)這個(gè)建議的沖動(dòng),希望對大家有所幫助。
關(guān)于c語(yǔ)言知識點(diǎn)本身,還是挺全面的,如果一個(gè)人大部分問(wèn)題都能詳細解答,說(shuō)明這個(gè)人對C語(yǔ)言的了解還是很不錯的。
不過(guò)我還是有幾點(diǎn)建議:
1、知識點(diǎn)組織得不是很好,顯得有些凌亂,有些相關(guān)知識點(diǎn)被分割到了多個(gè)地方,有些不夠全面,從學(xué)習的角度來(lái)將,不是非常好。
例如開(kāi)始就從字符串操作講起,我覺(jué)得不是很好。原因是字符串操作只是庫函數,對于c語(yǔ)言的字符串,我們開(kāi)始只要知道是0結束就夠了,函數后面在慢慢學(xué)習。了解字符串函數最好的辦法,就是自己實(shí)現這些函數,然后跟源代碼進(jìn)行比較,找出差距。
例如宏和Include,不應該分開(kāi),而應該作為預處理統一學(xué)習。預處理主要包括宏替換、文件包含和條件編譯三部分,另外的一些慢慢再了解就可以了。
此外,我覺(jué)得應該把static、const這些限定詞和變量結合在一起學(xué)習,順便把其它限定詞auto、extern、register、volatile、restrict、inline等整合在一起,從變量的類(lèi)型(存儲格式)、生命周期、作用域、可視性、存儲分配等各種角度出發(fā)進(jìn)行說(shuō)明。
2、有些提問(wèn)不是很恰當。
例如sizeof本質(zhì)上是函數還是宏?因為sizeof既不是函數,也不是宏,這么提問(wèn)容易讓人產(chǎn)生誤解。要想弄明白sizeof具體是什么,至少要明白編譯的整個(gè)過(guò)程,弄明白編譯時(shí)和運行時(shí)的概念。
例如數組提到的定義inta[10]; a[10]這個(gè)元素是無(wú)效的。這種說(shuō)法并不完全正確,a[10]并非無(wú)效,如果真弄明白了具體含義,完全是可以這么使用的(當然一般不推薦)。
3、學(xué)習時(shí)間的安排
像Switch、枚舉之類(lèi)的,如果有人講解,一天就足夠了。而數組應該和指針?lè )旁谝黄?,由于指針是c語(yǔ)言的難點(diǎn)之一,恐怕3周的時(shí)間都不一定足夠。
4、應該把c語(yǔ)言的學(xué)習當作當作一個(gè)系統,分成多個(gè)階段。
個(gè)人覺(jué)得分為三個(gè)階段比較合適:
第一階段是c語(yǔ)言本身,主要是類(lèi)型、操作符、表達式、語(yǔ)法結構、函數、指針、數組、結構等,想完全弄清楚這些其實(shí)很不容易。入門(mén)可以參照譚浩強的那本教科書(shū),不過(guò)這本書(shū)只適合了解一下,不深入,而且里面有些地方和例子都不是很好。還是推薦K&R的《The C ProgrammingLanguage》,最好是英文原版的。這階段可以同時(shí)學(xué)習《數據結構》,嘗試實(shí)現一些鏈表、樹(shù)的操作。
第二階段是結合著(zhù)實(shí)際情況,加深對函數以及相關(guān)知識的認識,試著(zhù)編寫(xiě)一些小軟件,實(shí)現一些小功能??梢院汀禔PUE》一起學(xué)習,里面講到的例子都可以自己寫(xiě)一下。
第三階段是深入學(xué)習編譯原理、操作系統等知識,了解代碼是如何從文本文件一步一步變成可執行文件的,知道棧、堆分別是什么,清楚程序的存儲空間布局,庫函數和系統調用的區別等。這階段可以在某個(gè)方面深入下去,編寫(xiě)一個(gè)比較大的軟件,例如一個(gè)簡(jiǎn)單的網(wǎng)絡(luò )程序、數據庫系統或者編譯器等。
因此知識點(diǎn)中的鏈接、運行時(shí)的數據結構、結構體中的內存對齊等和其它知識點(diǎn)放在一起并不是很好,畢竟大部分其它大部分題目都是c語(yǔ)言本身的知識,而這些知識點(diǎn)不少都是要看具體實(shí)現的,甚至有些并沒(méi)有標準答案。
另外,還有一些題外話(huà):
1、現在已經(jīng)比較少使用c語(yǔ)言開(kāi)發(fā)軟件了,c語(yǔ)言對開(kāi)發(fā)者的要求比較高,c語(yǔ)言不是一天兩天就能掌握的,因此首先要弄清楚自己是否真的對技術(shù)感興趣,對技術(shù)有種刨根問(wèn)底的沖動(dòng),而且愿意為此花功夫。如果僅僅是想搞搞應用,要快速實(shí)現某個(gè)功能,而不追求效率,不在乎具體實(shí)現方式,最好還是去學(xué)習更高級的語(yǔ)言。
2、c和c++不是一個(gè)語(yǔ)言,所謂c++是c語(yǔ)言的超集也是不正確的,如果當初c++的名稱(chēng)是d語(yǔ)言之類(lèi)的,可能就不會(huì )有這么多麻煩了。最主要兩者的指導思想是不一樣的,c語(yǔ)言默認其使用者什么都懂,所以將一切的控制都交給開(kāi)發(fā)者自己去完成,語(yǔ)言本身不作太多限制,給開(kāi)發(fā)者最大的自由度。這么做的好處和壞處都是非常明顯的,沒(méi)有誰(shuí)比誰(shuí)好的問(wèn)題,只有是否適用的問(wèn)題。
3、語(yǔ)言本身只是一個(gè)工具,將我們了解的計算機知識發(fā)揮、展示出來(lái)的工具,但基礎知識遠遠比語(yǔ)言本身更重要。如果認為學(xué)好了一門(mén)語(yǔ)言,就是所謂的高手了,那是不切合實(shí)際的。當然語(yǔ)言本身也需要我們花費很大精力,畢竟掌握好一個(gè)工具,更能讓我們的工作事半功倍。