海闊天空

          I'm on my way!
          隨筆 - 17, 文章 - 69, 評論 - 21, 引用 - 0
          數(shù)據(jù)加載中……

          測試你的C語言掌握程度

          字符串 
          學習時間:1.5W(“W”周,下同)
          知識點checklist
          strlen()函數(shù)的返回值是什么類型的?
          字符串strlen()的值,是否和他占據(jù)的內(nèi)存空間相同?
          你是否知道strcpy函數(shù)存在的潛在風險?如何避免?
          如果一個字符串沒有字符串結(jié)束符,而調(diào)用str開頭的庫函數(shù),會發(fā)生什么?
          Strcpy(),strcat(),strcmp(),strncpy(),strncat(),strncmp()內(nèi)部到底是如何運行的?這些函數(shù)到底對源字符串和目標字符串做了些什么?你是否觀察過它們運行時兩個字符串內(nèi)存的變化?
          上面這些函數(shù)使用時,各有哪些需要注意的地方?
          你會幾種字符串查找操作?
          c語言中有字符串這個數(shù)據(jù)類型嗎?
          對字符串進行操作的時候,是否為字符串結(jié)尾符預(yù)留存儲位置?不然的話容易造成非常訪問內(nèi)存。

          數(shù)組
          學習時間:2W
          知識點checklist
          你肯定知道,定義“int a[10];”,a[10]這個元素是無效的。
          你知道幾種數(shù)組初始化的方法?
          數(shù)組和指針有千絲萬縷的聯(lián)系而又不同,你是否對他們在不同情況下的使用進行過詳細的總結(jié)?
          “int calendar[10][20];”,這是一個什么樣的數(shù)組?它擁有10數(shù)組類型的元素,還是20個?
          “int a[10];”,數(shù)組名a在本質(zhì)上是一個什么?你是否打印過a的值?
          你知道幾種獲取數(shù)組某元素的方法?
          指針和數(shù)組相同嗎?什么時候相同?什么時候不同?
          用指針和下標訪問數(shù)組元素,那種方式更快?

          結(jié)構(gòu)體
          學習時間:1W
          知識點checklist
          你知道什么是位域結(jié)構(gòu)體嗎?如何定義它?如何使用它?
          你知道字節(jié)對齊對結(jié)構(gòu)體占用內(nèi)存空間大小的影響嗎?如何計算結(jié)構(gòu)體占用內(nèi)存的大小?


          學習時間:1W
          知識點checklist
          你知道宏的本質(zhì)是什么嗎?函數(shù)?語句?類型定義?或者其他?
          你知道語言設(shè)計者為什么設(shè)計宏嗎?這些原因目前是否仍然成立?
          你會設(shè)計帶有參數(shù)的宏嗎?
          你知道使用宏的參數(shù)的的時候的注意事項嗎?
          你會設(shè)計帶有可變參數(shù)的宏嗎?
          你知道使用宏有什么劣勢嗎?
          你有沒有更好的替代方案?


          枚舉
          學習時間:0.5W
          知識點checklist
          是否可以指定枚舉中各項的值?
          如果不指定值,枚舉的第一個值是多少?
          枚舉的值是否可以是負數(shù)?
          定義枚舉的時候,你是否專門定義了枚舉的最小值和最大值?


          Switch
          學習時間:0.5W
          知識點checklist
          switch(c)中的c的數(shù)據(jù)類型有哪些?
          你是否在所有的switch中都加了default語句?
          是否在所有的case中都加了break語句(一般情況的做法)?如果你不加break,將會發(fā)生什么?


          Static
          學習時間:1W
          知識點checklist
          static的三個主要作用是什么?
          static的修飾的局部變量是保存在什么地方的?全局變量哪?
          static修飾的全局變量和函數(shù),在其他的文件中是否可以訪問?如何訪問?
          你知道static是c語言中實現(xiàn)封裝和隱藏的利器嗎?你是否經(jīng)常使用?
          定義在不同源文件中的static全局變量,編譯器是否允許他們的變量名稱相同?他們在內(nèi)存中的地址是否相同?函數(shù)那?


          const
          學習時間:1W
          知識點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
          學習時間:1W
          知識點checklist
          對于字符數(shù)組,strlen和sizeof的值是否相同?
          Sizeof本質(zhì)上是函數(shù)還是宏?
          Sizeof的返回值是什么類型?


          指針
          學習時間:3W
          知識點checklist
          “int *p;”&p,p,*p他們的值分別表示什么含義?
          你定義的指針初始化了沒?
          你理解指針的指針的概念嗎?你會使用嗎?
          “int *pi_value; pi_value = 0x100000;” pi_value + 1的值是是多少?
          你會定義函數(shù)指針嗎?
          你會使用函數(shù)指針調(diào)用函數(shù)嗎?
          關(guān)于指針和數(shù)組,請參見知識點數(shù)組。


          動態(tài)分配內(nèi)存
          學習時間:1W
          知識點checklist
          動態(tài)分配的內(nèi)存是保存在什么地方的?
          什么情況下使用動態(tài)分配內(nèi)存?
          動態(tài)申請內(nèi)存一定要釋放,否則會內(nèi)存泄露。你是否使用過內(nèi)存檢測工具?


          函數(shù)
          學習時間:1W
          知識點checklist
          如何查看函數(shù)在內(nèi)存中的地址?
          如何給一個函數(shù)指針賦值?
          你是否會定義可變?nèi)雲(yún)⒑瘮?shù)
          你是否可以區(qū)分函數(shù)的形參與實參?
          如何定義函數(shù)名,以準確的表達函數(shù)的用途?
          你是否使用const來修飾函數(shù)入?yún)⒑头祷刂担员淼奶囟ǖ暮x?
          遞歸如何使用?

          變量
          學習時間:1W
          知識點checklist
          全局變量,局部變量,常量分別保存在內(nèi)存中的什么地方?
          不同類型的變量,你是否知道其作用域?
          全局變量和局部變量是否可以重名?你是否在這樣做?
          局部變量在函數(shù)退出后是否有效,為什么?
          全局變量為什么不允許定義在頭文件中?有何危害?

          鏈接(linux)
          學習時間:1W
          知識點checklist
          鏈接位于編譯過程的那個階段?
          動態(tài)鏈接庫和靜態(tài)鏈接庫使用時有何區(qū)別?
          如何對動態(tài)鏈接庫進行動態(tài)加載(不用重啟程序而加載鏈接庫)?
          動態(tài)鏈接有何優(yōu)點?
          動態(tài)鏈接庫中是否定義了非static的全局變量?你是否知道這是一個非常危險的動作?
          動態(tài)庫中的全局變量(非static)和函數(shù)(非static)是否可以和上層全局變量和函數(shù)重名?重名后會發(fā)生什么事情?


          運行時的數(shù)據(jù)結(jié)構(gòu)(linux)
          學習時間:1W
          知識點checklist
          你知道什么是段的概念嗎?
          可執(zhí)行程序可以分為幾個段?每個段保存的是什么內(nèi)容?
          如何查看可執(zhí)行程序各個段的大小?
          當函數(shù)被調(diào)用時發(fā)生了什么?
          你有沒有試過程序的棧空間最大有多大?程序超過此大小會發(fā)生什么?
          你使用的系統(tǒng)的棧是向下生長的,還是向上生長的?

          Include
          學習時間:0.5W
          知識點checklist
          1、如何避免對同一頭文件的多次include?


          聲明
          學習時間:1W
          知識點checklist
          什么是聲明,什么是定義?
          你是否會運用c語言聲明的優(yōu)先級規(guī)則?


          關(guān)于復(fù)雜度:
          軟件的首要技術(shù)使命是管理復(fù)雜度。
          優(yōu)秀程序員的一個特質(zhì)是將復(fù)雜的事情簡單化,而非將簡單的問題復(fù)雜化。所以,他們一般會選擇簡單的解決方案。
          極盡機巧,復(fù)雜的解決方案,除了將新手搞得暈頭轉(zhuǎn)向之外,別無他用。
          閱讀優(yōu)秀程序員的代碼,是一種享受,你很少遇到思維的阻力,你可以盡情的享受簡單之美。
          所以,對難以理解的語言特性,要慎用、少用,最好不用,而以簡單的解決方案替代之。但是,在做這些之前,你必須對這些知識點理解深刻。

          如果你發(fā)現(xiàn)有什么錯誤,請和我聯(lián)系。
          如果這些知識點你90%以上都不知道,或者理解不深刻——我希望你可以加入DS計劃,共同學習。
          如果這些知識點你90%以上都知道,并且理解深刻——我希望你也可以加入DS計劃,成為知識點專家,對新手進行指導(dǎo)。
          如果你知道的比上面列出的還要多,或者還有你認為非常重要的,建議你也分享出來,對上面列舉的內(nèi)容進行優(yōu)化。

          原文地址:http://blog.csdn.net/chgaowei/archive/2009/10/27/4731498.aspx
          DS計劃加入方式:
          1、 方式1 :加入 QQ 群: 93684322 。
          2、 方式2 :加入 CSDN 群組: DS計劃 。 

          一位網(wǎng)友的建議

          對《C方向項目詳細計劃》的一點建議
          作者:陳新
          原文: http://hi.csdn.net/space-1568678-do-thread-id-990.html
          首先自己介紹一下,我已經(jīng)工作多年,目前半管理半開發(fā),主要使用PHP和C語言,對于C語言有過一定研究,有一些經(jīng)驗。
          我很少上CSDN,雖然已經(jīng)注冊了很長時間,今天心血來潮進來看看,就發(fā)現(xiàn)了常高偉的的帖子《深入學習C語言知識點checklist——測試你掌握C的程度》,仔細看了一遍,覺得還不錯,這年頭還執(zhí)著于技術(shù)細節(jié)的人很少了,可見作者還是下了不少功夫的。
          接著就看到了“讀S計劃”,覺得有點意思,看完之后就有了寫這個建議的沖動,希望對大家有所幫助。

          關(guān)于c語言知識點本身,還是挺全面的,如果一個人大部分問題都能詳細解答,說明這個人對C語言的了解還是很不錯的。
          不過我還是有幾點建議:
          1、知識點組織得不是很好,顯得有些凌亂,有些相關(guān)知識點被分割到了多個地方,有些不夠全面,從學習的角度來將,不是非常好。
          例如開始就從字符串操作講起,我覺得不是很好。原因是字符串操作只是庫函數(shù),對于c語言的字符串,我們開始只要知道是0結(jié)束就夠了,函數(shù)后面在慢慢學習。了解字符串函數(shù)最好的辦法,就是自己實現(xiàn)這些函數(shù),然后跟源代碼進行比較,找出差距。
          例如宏和Include,不應(yīng)該分開,而應(yīng)該作為預(yù)處理統(tǒng)一學習。預(yù)處理主要包括宏替換、文件包含和條件編譯三部分,另外的一些慢慢再了解就可以了。
          此外,我覺得應(yīng)該把static、const這些限定詞和變量結(jié)合在一起學習,順便把其它限定詞auto、extern、register、 volatile、restrict、inline等整合在一起,從變量的類型(存儲格式)、生命周期、作用域、可視性、存儲分配等各種角度出發(fā)進行說明。
          2、有些提問不是很恰當。
          例如sizeof本質(zhì)上是函數(shù)還是宏?因為sizeof既不是函數(shù),也不是宏,這么提問容易讓人產(chǎn)生誤解。要想弄明白sizeof具體是什么,至少要明白編譯的整個過程,弄明白編譯時和運行時的概念。
          例如數(shù)組提到的定義int a[10]; a[10] 這個元素是無效的。這種說法并不完全正確,a[10]并非無效,如果真弄明白了具體含義,完全是可以這么使用的(當然一般不推薦)。
          3、學習時間的安排
          像Switch、枚舉之類的,如果有人講解,一天就足夠了。而數(shù)組應(yīng)該和指針放在一起,由于指針是c語言的難點之一,恐怕3周的時間都不一定足夠。
          4、應(yīng)該把c語言的學習當作當作一個系統(tǒng),分成多個階段。
          個人覺得分為三個階段比較合適:
          第一階段是c語言本身,主要是類型、操作符、表達式、語法結(jié)構(gòu)、函數(shù)、指針、數(shù)組、結(jié)構(gòu)等,想完全弄清楚這些其實很不容易。入門可以參照譚浩強的那本教科書,不過這本書只適合了解一下,不深入,而且里面有些地方和例子都不是很好。還是推薦K&R的《The C Programming Language》,最好是英文原版的。這階段可以同時學習《數(shù)據(jù)結(jié)構(gòu)》,嘗試實現(xiàn)一些鏈表、樹的操作。
          第二階段是結(jié)合著實際情況,加深對函數(shù)以及相關(guān)知識的認識,試著編寫一些小軟件,實現(xiàn)一些小功能。可以和《APUE》一起學習,里面講到的例子都可以自己寫一下。
          第三階段是深入學習編譯原理、操作系統(tǒng)等知識,了解代碼是如何從文本文件一步一步變成可執(zhí)行文件的,知道棧、堆分別是什么,清楚程序的存儲空間布局,庫函數(shù)和系統(tǒng)調(diào)用的區(qū)別等。這階段可以在某個方面深入下去,編寫一個比較大的軟件,例如一個簡單的網(wǎng)絡(luò)程序、數(shù)據(jù)庫系統(tǒng)或者編譯器等。
          因此知識點中的鏈接、運行時的數(shù)據(jù)結(jié)構(gòu)、結(jié)構(gòu)體中的內(nèi)存對齊等和其它知識點放在一起并不是很好,畢竟大部分其它大部分題目都是c語言本身的知識,而這些知識點不少都是要看具體實現(xiàn)的,甚至有些并沒有標準答案。

          另外,還有一些題外話:
          1、現(xiàn)在已經(jīng)比較少使用c語言開發(fā)軟件了,c語言對開發(fā)者的要求比較高,c語言不是一天兩天就能掌握的,因此首先要弄清楚自己是否真的對技術(shù)感興趣,對技術(shù)有種刨根問底的沖動,而且愿意為此花功夫。如果僅僅是想搞搞應(yīng)用,要快速實現(xiàn)某個功能,而不追求效率,不在乎具體實現(xiàn)方式,最好還是去學習更高級的語言。
          2、 c和c++不是一個語言,所謂c++是c語言的超集也是不正確的,如果當初c++的名稱是d語言之類的,可能就不會有這么多麻煩了。最主要兩者的指導(dǎo)思想是不一樣的,c語言默認其使用者什么都懂,所以將一切的控制都交給開發(fā)者自己去完成,語言本身不作太多限制,給開發(fā)者最大的自由度。這么做的好處和壞處都是非常明顯的,沒有誰比誰好的問題,只有是否適用的問題。
          3、語言本身只是一個工具,將我們了解的計算機知識發(fā)揮、展示出來的工具,但基礎(chǔ)知識遠遠比語言本身更重要。如果認為學好了一門語言,就是所謂的高手了,那是不切合實際的。當然語言本身也需要我們花費很大精力,畢竟掌握好一個工具,更能讓我們的工作事半功倍。


          摘自:http://topic.csdn.net/u/20091027/22/0573CFB5-F1BF-4CF2-8E60-13D907301A8E.html

          posted on 2009-10-31 13:10 石頭@ 閱讀(579) 評論(0)  編輯  收藏 所屬分類: 計算機基礎(chǔ)


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 建宁县| 定陶县| 仙游县| 蒲城县| 台江县| 徐水县| 安顺市| 平阴县| 花莲市| 宁海县| 鄂尔多斯市| 辽中县| 长葛市| 巫山县| 龙胜| 洛浦县| 和静县| 津南区| 天津市| 手机| 冕宁县| 濮阳县| 南皮县| 静乐县| 凤翔县| 比如县| 咸宁市| 图们市| 教育| 城口县| 五原县| 泰安市| 曲阳县| 济南市| 南投市| 扎赉特旗| 江门市| 元氏县| 海淀区| 怀来县| 合肥市|