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