【摘 要】本文分析了C語言的初學者在學習中出現的問題,并探究了產生這些問題的原因,說明了C語言的重點與難點學習,并對此提出了積極的解決方案,具體闡述了改進C語言學習的措施。
【關鍵詞】C語言;方法;難點;措施
一、C語言學習方法
在學習C語言之前,首先就要選擇一本教材,對于初學者,我個人并不建議去讀電子書籍,最好是買紙質書來學習。比如比較有名的“C程序設計”就很不錯,尤其是第二版,我也看過,比較適合中國人來初學,整本書都在全面系統的講解C的語法結構,構成C的語言元素包括:數據類型,支持的運算符,標識符(是由程序員按照命名規則起的名字,用于變量名,函數名,宏名等等),關鍵字(編譯系統用于實現C內部功能的詞,比如:轉向goto和中斷break等等)等。看完這本書你基本上可以寫一些簡單的小程序,當然是DOS下的程序。如果你想在進一步深入學習C的話,可以看“C陷阱與缺陷”這本書。寫這本書的作者是在Bell工作對C是非常精通的,應該算是大師級的人物了.之前是沒有辦法想象到的.在初學C的過程中,比如你會看“C程序設計”來初學C,當你學完每一章的時候要把習題來完成,這里就是考驗你學到的知識了,看看你應用能力怎么樣?尤其是程序設計題目,比較有意思。哪里不懂了。可以翻回去看書中的解釋。如果沒有解釋或你還是不明白,可以去問別人,與其他人交流,bbs,QQ或Google,直到你弄明白為止。
不要認為學習只是在看書,看一便就可以了.你應該學會記筆記,在記筆記的過程中,其實你就是在學習,從知識的分析,理解,歸納,到最后以自己的思維方式記下來,這整個過程就是把書中的知識抽象到你自己的腦袋里.個人感覺學習效果非常好,不懂就問,要多多與人交流,要多思考,遇到問題自己先多想想,實在找不到問題出在哪,在去請教別人,不要有不懂的地方就直接去問別人,那樣對你沒太大的好處.其實要學會給自己安排適合自己的學習計劃,我大致來估計了一下,如果你每天能花4個小時安靜的,用心去學習的話,30天之內你應該可以掌握C語言了。其實在整個學習過程中你大多數時間都在看書,而不是面對電腦.在調試你的代碼之前,先在紙上把核心代碼大致寫出來,分析一下:程序的組成模塊(可以是一個函數或多個),由幾個函數來實現,接口的封裝.采用哪種數據結構更適合一些。關鍵在于算法.在你的最終程序發布之前,最好把你的代碼行數減到最少。不要只想著把代碼寫多,過多的代碼對程序來說是負擔.你可以在Internet上下載一個文件(C語言經典例題.chm),里面大致包含了上百個經典的例題.每一個例題都是C語言某部分的典型應用,花時間把這個文件中的所有例題代碼研究一下,最好能自己把代碼改善,以自己的方式來求解.以后你會發現你在寫一些應用程序的時候經常會有一些算法.會涉及到我之前提到的例題.最后我認為你可以自己來寫C語言標準函數,比如strcpy();strlen();strcat();最好不要過分依賴庫函數。
二、C語言學習的難點
我可以給你形象的來描述一下:float Variable;//聲明一個單精度實型的變量;以上便是Variable的內存結構了,16位下的float占用4個字節,內存地址是線性編碼的,我們可以很容易的看出Variable的首地址就是他第一個單元的地址1001,好的,繼續向下看:float*Pointer=Variable;//聲明一個指向Variable的指針Pointer我們的程序可以這樣來執行:Variable=1.0;直接給Variable賦值,我們稱為直接訪問.也可以這樣執行:*Pointer=1.0;也可以通過指針變量來賦值,前面的*是間接運算符號,意思是求Pointer內部存儲地址所標識的內存單元,也就是Variable。此時,是賦值是通過間接訪問來實現的。可以這樣形象的描述:以上應該是指針實現的基本解釋,很多優秀的程序寫作者都說指針是C語言中的精華,的確如此,很多優秀的程序寫作者寫程序都非常依賴指針,因為它很方便,實際上指針所訪問的對象是沒有限制的,他可以指向任何類型的變量,前提是只要我們知道內存地址。因此指針也并不安全,在開發網絡程序的時候,盡量要少使用指針。下面我們在來看一下指針在數組中的使用。
數組中的指針:簡單的來解釋下數組,數組結構在C中使用比較普遍,其實最常用的就是char類型的數組,主要是用于字符串操作。實際上數組是“同類型變量的有限集合”。我想這應該不難理解吧。數組在內存中占用連續的內存單元(地址連續),來存儲數組中的每一個元素。數組是預先分配好指定長度的內存單元,供數組元素使用,它并不支持動態內存分配。在內存中想要唯一的確定數組,需要2個標識:入口地址(函數名)和結束標記('\0')。有些語言并不向C語言這樣支持字符串結束標記,它們必須要另外聲明一個變量來標識尾元素的下標。那數組名其實就是這一組內存單元的首單元,他的地址就是整個數組的入口地址。此時應該明白了,數組名是一個指針,這樣理解沒有問題。不錯,在具體操作的時候不允改變數組名的地址,也不符合實際要求。這樣就可以明白數組名是一個什么 const Pointer(指針常量)。我們可以這樣做:
int Array[10];
int *Pointer;
Pointer=Array;
for(i=0;i<10;++i)
Pointer==i;
以上代碼應該是沒問題吧,同類型的指針,完全可以勝任數組名的任務。一點問題沒有而且可以運行的很好。當然,我們可以進一步把代碼這樣來寫:把for(i=0;i<10;++i)
Pointer=i;
改成
for(i=0;i<10;++i,Pointer++)
*Pointer=i;
如果數組類型是char的話,那就更方便了,因為字符串存存在一個在尾元素之后的結束標記('\0'),下面給出一個簡單的代碼,應用char Pointer:
char * my_strcpy(char * dst, const char * src)
{
char * cp = dst;
while( *cp++ = *src++ );// 注意運算符的優先級與結合性
return( dst );//返回新傳的指針
}
以上代碼實現字符傳Copy功能,代碼是不是很簡潔啊。如果不需要移動內存塊的話,我們完全可以通過交換指針(內存地址)來實現排序操作,其效率應該是很客觀的。補充一句:千萬要弄清楚,指針本身與指針所指向的變量不是一個單元。
【參考文獻】
[1]陳廣群,孔發弟.C語言課堂教學改進初探[J].南京廣播電視大學學報,2009(02).
[2]魏青.《C語言》教學中學生學習興趣的培養[J].電腦知識與技術,2010(21).
[3]祝瑞.快樂教學法在C語言教學中的運用[J].工會論壇(山東省工會管理干部學院學報),2010(06).
[4]師艷俠.論如何激發學生學習信息技術的興趣[J].才智,2009(10).
[5]祝賀.C語言教學中存在的問題及對策探討[J].黑龍江科技信息,2010(13).