當前位置:編程學習大全網 - 編程語言 - C語言怎麽學?

C語言怎麽學?

淺談C語言學習方法

本人是壹名windows程序寫作員,使用的語言是C語言.其他語言了解壹點點,但並不擅長.可能對於初學者來說,首先就是選擇壹門程序設計語言.當然,今天我將要說的不是這方面.每種語言都有它所擅長的領域與層面.當然對於其他非C語言我是壹名門外汗,我也不會站在C語言的立場去談論其他任何壹門語言.好了,在開始進入正題之前,我想談談個人對C的壹些看法:

C語言是壹種早期的計算機語言,最初誕生目的是為了提供壹種基於UNIX系統的工作語言.但是,後來卻被越來越多的人發現它的優點與潛力.C本身比較接近底層,適合開發系統軟件甚至是操作系統.我個人也認為它是界於高級語言與匯編語言之間的中級語言.C語言是壹門結構化語言(我認為主要是指它的控制結構如:if if-else while for等等).C程序設計上有提到"自頂向下,逐步深入".以函數為原子功能模塊.對於大型的程序來說模塊化是很重要的,有壹句話說的很好"優質的程序首先就是便與人們之間的相互討論與交流,其次才是執行效率".當然我個人認為任何壹名程序寫作者,都應該養成壹種特定的思維方式,以程序的思維方式來思考程序的實現.前提就是要足夠的來了解計算機底層技術.要不我想就連學習都是很困難的,凡事都是壹個思路的問題嘛.標準的來衡量,C應該算是高級語言陣營的壹份子.可很多有C語言開發經驗的程序寫作者.通常親切的稱C為界於底級語言與高級語言之間的中級計算機語言.當然不是因為C比高級語言要差,之所以這麽認為是因為C既具有高級語言的結構化與可理解性又具有低級語言的高效率.同時C的移植性也是非常不錯的,大家應該知道,越是接近硬件,接近底層的語言就越加的依賴硬件環境,也就是我們所說的設備相關性.C這壹點做的是非常棒的.說了這些,在從另壹個角度去分析C語言.當然每種語言都有它自身的優缺點,C也壹樣.比如在現在高級語言與頂層技術的角度來看的話,C最大的缺陷就是Data與算法的分離.舉壹個例子: 對於壹個擁有幾千行甚至上萬行Code的程序來說,如果修改Data,比如我在Structure中增加壹個字段,可能為此我的整個程序都要改動,這使得程序的可重用性大大降低.開發周期也大大的延長.但是在底層的角度來看這也正是C的優點.我為什麽要這麽說呢?我個人認為在求解與實現壹個小問題的時候,我們可以寫出壹個通用的模塊處理不同的Data.當然比如某些經常用到的,基於數據結構的壹些常用算法我們可以寫出來在開發的時候我們可以直接把預先編寫的模塊插入到我們的程序中去,這不也是大大低了開發周期嗎?初學者完全可以根據自己的需求來編寫壹個自定義庫.好了,說了這些,有些地方我理解錯了,還請各位指出來,交流是很重要的,前提是要把自己的心態放平.下面我將談論本問的重點,也就是如何來學習C語言,是給那些初學者讀的.

正題部分:

有人可能會說:學習還用妳教啊,誰沒上過學啊.其實我今天要說的只是,站在壹個過來人的角度,來分析與解釋學習C語言的過程中比較困難的地方.當然我個人也會對比較具體的問題進行解釋(個人看法).我壹直在強調個人看法,我是想讓大家明白,對於同壹個問題大家可能都很難達成統壹的意見,希望批評的時候客氣點就好嘍!

初學者該看哪些書來入門:

在學習C語言之前,首先就要選擇壹本教材,對於初學者,我個人並不建議去讀電子書籍,最好是買紙質書來學習.比如比較有名的"C程序設計"就很不錯,尤其是第二版.我也看過,比較適合中國人來初學.整本書都在全面系統的講解C的語法結構,構成C的語言元素包括:數據類型,支持的運算符,標識符(是由程序員按照命名規則起的名字,用於變量名,函數名,宏名等等),關鍵字(編譯系統用於實現C內部功能的詞,比如:轉向goto和中斷break等等)等.看完這本書妳基本上可以寫壹些簡單的小程序,當然是DOS下的程序.如果妳想在進壹步深入學習C的話,可以看"C陷阱與缺陷"這本書.寫這本書的作者是在Bell工作對C是非常精通的,應該算是大師級的人物了.如果妳暫時不想深入C的話,也沒問題,因為此時妳完全可以把C當作壹種編程工具來使用,妳要做的就是多寫Code來讓自己熟悉C語言.經驗是非常重要的,"經驗是檢驗真理的唯壹方法".當然妳不會紙上談兵,如果妳有過多的開發經驗的話,就知道在紙上或最初的設想的Code拿到計算機上來實現,最終會發現有很多地方都是不合理的,之前是沒有辦法想象到的.在初學C的過程中,比如妳會看"C程序設計"來初學C,當妳學完每壹章的時候要把習題來完成,這裏就是考驗妳學到的知識了,看看妳應用能力怎麽樣?尤其是程序設計題目,比較有意思.哪裏不懂了.可以翻回去看書中的解釋.如果沒有解釋或妳還是不明白,可以去問別人,與其他人交流. bbs,QQ或Google.直到妳弄明白為止.當妳把問題最終解決的時候,我敢打賭,此時妳壹定很興奮,或者是比較興奮.這個時候知識已經在妳的大腦裏了.

下面我為妳推薦幾本不錯的關於C語言籍:

C編程規範

C語言大全第四版 (個人感覺不錯,裏面有提及C標準方面的東西)

C和指針

The C programming Language (經典著作)

如果妳要看電子書的話,以上幾本書在Google上很容易就可以找到.

關於C語言的初步理解:

對於初學者,會有太多的疑問,原因是妳的知識面太小.現在我為妳解釋壹些C相關的東西.目的是讓妳能夠有壹個大致清晰的方向,來給自己安排學習計劃.專業的來說,我們是或將是壹名程序員,程序員當然就是要開發程序了.對於軟件開發方面我來解釋下術語:

C,C++,ASM,Basic,Java 這些是計算機語言.計算機語言很多,我就不多說了.

Visual C++,Visual Basic, Microsoft研發的開發環境,開發環境包括:編譯器,庫函數(每種C語言編譯器都支持標準庫,同時它們也會擴展自己的庫,所以很多比較以來庫函數實現的程序員,在轉向不同的開發環境的時候最初總是不使用的,會遇到很多問題),壹些資源模板等等.Visual 就是可視的意思,後面的就是語言.Visual C++支持C與C++2種語言,是根據文件的擴展名來判斷采用哪種編譯內核.

什麽是"面向對象"與"面向過程"? 其實是2種完全不同的程序設計思想,C語言是面向過程語言,而C++是面向對象語言.在面向對象的語言中有"類(Class)"這個東西.C中沒有.對象是由類來派生的壹個實例,相反類就象是壹個模板.

什麽是SDK? SDK就是軟件開發工具包(Software Development Kit).指的範圍比較廣,通俗的說,凡是能夠與軟件開發過程占上邊的東西都屬於.比如:庫文件,參考資料,接口函數,當然語言也應該屬於.

DDK就是設備驅動程序開發工具包.

Turbo C: 這是壹個比較精致的C語言編譯器.

理論上來說任何壹門語言都可以在任何壹種操作系統上運行,前提是操作系統要支持.也就是我們所說的應用程序接口,比如Window API(Application Programming Interface),其實是Microsoft內部定義的接口函數用於實現壹些Windows內部的功能.壹些對象的描述術語,在不同平臺上是不同的,比如:Windows下的"調用",經常被稱為"呼叫","返回"被稱為"傳回".

什麽是"算法"? 妳最初只需要知道算法實際上就是對特定的Data進行運算的壹段代碼而已.也可以認為在求解壹道題目的時候,采取的方法與步驟的總稱.對於基本的C程序來說,實際上就是由Data與算法來組成的.

什麽是"數據結構"? 如果要是系統的講解,還需要壹本書"數據結構",簡單的說:是程序要處理的數據在內存中的存儲與組織的方式,分為:物理結構與邏輯結構.邏輯結構就是我們抽象化以後得到的大腦影象.

什麽是"函數庫"? 它們以文件的形式存儲,是預先定義好的函數的集合,我們的程序可以直接調用.當然前提是要包含它的頭文件(庫函數的原型聲明).這些函數是在靜態連接期間組成到.exe文件中去的.Windows又存在另壹種庫,叫做動態連接庫(DLL).

GUI: 也就是"圖形用戶界面",就是我們在Windows上看到的,存在:菜單欄,滾動條與顯示區域的窗口.

GDI: 圖形設備接口,從程序寫作者的角度來看,其實GDI就是由上百個函數與數據形態和壹些相關的數據結構所組成的.

學習C語言的全過程:

仔細想想,實際上學習C語言,最初是應該先學習C語言的基礎語法.也就是學習C語言的組成部分.壹部分壹部分的向下學.知識要壹點壹點的鞏固的.本人假設妳學習C語言是看"C程序設計".我認為妳應該先把C程序設計仔細的看壹便,這樣妳應該可以對整本書和C語言的整體組成結構有個大致的清晰了解.不要認為學習只是在看書,看壹便就可以了.妳應該學會記筆記,在記筆記的過程中,其實妳就是在學習,從知識的分析,理解,歸納,到最後以自己的思維方式記下來,這整個過程就是把書中的知識抽象到妳自己的腦袋裏.個人感覺學習效果非常好,不懂就問,要多多與人交流,要多思考,遇到問題自己先多想想,實在找不到問題出在哪,在去請教別人,不要有不懂的地方就直接去問別人,那樣對妳沒太大的好處.其實要學會給自己安排適合自己的學習計劃,我大致來估計了壹下,如果妳每天能花4個小時安靜的,用心去學習的話,30天之內妳應該可以掌握C語言了.其實在整個學習過程中妳大多數時間都在看書,而不是面對電腦.在調試妳的代碼之前,先在紙上把核心代碼大致寫出來,分析壹下:程序的組成模塊(可以是壹個函數或多個),由幾個函數來實現,接口的封裝.采用哪種數據結構更適合壹些.關鍵在於算法.在妳的最終程序發布之前,最好把妳的代碼行數減到最少.不要只想著把代碼寫多.過多的代碼對程序來說是負擔.妳可以在Internet上下載壹個文件(C語言經典例題.chm),裏面大致包含了上百個經典的例題.每壹個例題都是C語言某部分的典型應用.花時間把這個文件中的所有例題代碼研究壹下,最好能自己把代碼改善,以自己的方式來求解.以後妳會發現妳在寫壹些應用程序的時候經常會有壹些算法.會涉及到我之前提到的例題.最後我認為妳可以自己來寫C語言標準函數,比如strcpy(); strlen();strcat();最好不要過分依賴庫函數.

C語言學習的難點:

現在應該是已經講到壹個重點的環節.很多網友都說學習C語言很難,我認為C中有些部分是比較復雜,難理解的.當然在妳具有了豐富的開發經驗以後,這以不在是問題了.下面我個人會對我認為學習C的時候比較難學的地方進行我自己的闡述,如果哪裏不正確,還請各位指出:

指針的出現:

我想有很多初學者學習到指針那壹章都感覺很難,下面我就以自己的想法來解釋下指針這個特殊的數據類型,

基本變量大家可能並不難理解,因為基本變量其內部存儲了同類型的常量,事實上指針也是變量,不過呢,這個變量和基本變量有點不壹樣,那妳又問了:是哪裏不壹樣呢? 我告訴妳,簡單的來理解其實普通的變量內部存儲了同類型的常量,而指針變量內部存儲的則是"同類型變量的首地址".這樣妳能夠理解嗎,是很簡單的解釋,但不失本質.事實就是這樣的.如果妳不理解"同類型變量的首地址"的話,我可以給妳形象的來描述壹下:

float Variable; //聲明壹個單精度實型的變量

此時,編譯器已經給Variable分配了內存空間,結構如下:

__________

| |1001

|---------

| |1002

|---------

| |1003

|---------

| |1004

|---------

以上便是Variable的內存結構了,16位下的float占用4個字節,內存地址是線性編碼的,我們可以很容易的看出Variable的首地址就是他第壹個單元的地址1001,好的,繼續向下看:

float *Pointer=&Variable; //聲明壹個指向Variable的指針Pointer

_________

|1001 | 這是Pointer的內存結構

|_______|

我們的程序可以這樣來執行:

Variable=1.0;

直接給Variable賦值,我們稱為直接訪問.

也可以這樣執行:

*Pointer=1.0;

也可以通過指針變量來賦值,前面的*是間接運算符號,意思是求Pointer內部存儲地址所標識的內存單元.也就是Variable.此時,是賦值是通過間接訪問來實現的.可以這樣形象的描述:

________ (指向Variable) __________

|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;

不好意思,我記不清了,指針的++運算是地址+1還是向後移動壹個元素的位置,如果是地址+1的話,以上代碼在改成這樣:

for(i=0;i<10;++i,Pointer+sizeof(int))

*Pointer=i;

如果數組類型是char的話,那就更方便了,因為字符串存存在壹個在尾元素之後的結束標記('\0'),下面給出壹個簡單的代碼,應用char Pointer:

char * my_strcpy(char * dst, const char * src)

{

char * cp = dst;

while( *cp++ = *src++ ); // 註意運算符的優先級與結合性

return( dst ); //返回新傳的指針

}

以上代碼實現字符傳Copy功能,代碼是不是很簡潔啊.如果不需要移動內存塊的話,我們完全可以通過交換指針(內存地址)來實現排序操作,其效率應該是很客觀的.補充壹句:千萬要弄清楚,指針本身與指針所指向的變量不是壹個單元.

  • 上一篇:保定公安局經偵支隊警務輔助人員招聘公告
  • 下一篇:用JAVA編寫壹個記事本~只要實現以下功能:插入~刪除~查找~保存~另存為~(多來點註釋~樓主怕看不懂)
  • copyright 2024編程學習大全網