我是壹名windows程序員,使用的語言是c,其他語言我略知壹二,但不擅長。或許對於初學者來說,第壹件事就是選擇壹門編程語言。當然,這不是我今天要講的內容。每種語言都有自己的專業領域和水平。當然,我對其他非C語言比較陌生,也不會站在C的立場上講其他任何語言,好吧,壹開始,
c語言是早期的計算機語言,最初誕生是為了提供壹種基於UNIX系統的工作語言。然而,越來越多的人發現了它的優勢和潛力。c本身已經接近底部了。適合開發系統軟件甚至操作系統。個人認為是介於高級語言和匯編語言之間的中間語言。c語言是結構化語言(我覺得主要是指它的控制結構,比如if if-else while for等。).c編程已經提到了“自上而下,循序漸進”。函數是原子功能模塊。模塊化對於大型程序非常重要。有句話叫“高質量的程序首先是和人討論和溝通,然後才是執行的效率”。當然,我個人認為任何壹個節目編寫者都應該養成特定的思維方式,用節目的思維方式去思考節目的實現。前提是對計算機底層技術有足夠的了解。不然我覺得連學習都很難,什麽都是思維的問題。按標準來說,C應該算是高級語言陣營的壹員。但很多有C語言開發經驗的程序員,通常會親切地稱C是介於低級語言和高級語言之間的壹種中級計算機語言。當然不是因為C比高級語言差,而是因為C既有高級語言的結構和可理解性,又有低級語言的高效率。同時C的可移植性也很好。要知道越接近硬件,接近底層的語言越依賴硬件環境,這就是我們所說的設備依賴。c很好。說到這裏,我們是從另壹個角度來分析C。當然,每種語言都有自己的優缺點,C也是如此,比如從高級語言和頂層技術來看,C最大的弊端就是數據和算法的分離。舉個例子,對於壹個有幾千行甚至上萬行代碼的程序,如果我修改了數據,比如我在結構中添加了壹個字段,我的整個程序可能都要改動,這就大大降低了程序的復用性,大大延長了開發周期。但從底層來看,這也是c的優勢,我為什麽要這麽說呢?我個人認為在解決和實現壹個小問題的時候,可以寫壹個通用的模塊來處理不同的數據。當然,比如我們可以根據數據結構寫壹些常用的算法。在開發時,我們可以直接將預先編寫好的模塊插入到我們的程序中。這不也大大縮短了開發周期嗎?初學者可以根據自己的需求寫壹個自定義庫。嗯,有些事情我理解錯了,請指出,溝通很重要,前提是妳保持心態平和。下面我就說說這個問題的重點,就是如何學習C語言,這是給初學者的。
主題部分:
有人可能會說:還需要妳來教學習。誰沒上過學?其實我今天想說的只是從壹個有經驗的人的角度來分析和解釋C語言學習過程中的難點。當然,更具體的問題我也會說明(個人觀點)。我壹直在強調我個人的觀點。我想讓大家明白,對於同壹個問題,大家可能很難達成統壹的意見。我希望妳批評的時候有禮貌。
新手入門應該看哪些書:
在學習C語言之前,首先要選擇壹本教材。對於初學者,我個人不建議看電子書,還是買紙質書學習比較好。比如著名的《C程序設計》就很不錯,尤其是第二版。我也看過,比較適合國內初學者。全書對C的語法結構進行了全面系統的講解,組成C的語言元素包括:數據類型、支持的運算符、標識符(程序員根據命名規則給定的名稱,用於變量名、函數名、宏名等。)、關鍵字(編譯系統用來實現C內部功能的詞,如轉到goto、breaking等。),等等。看完這本書,基本上就能寫壹些簡單的小程序了,當然是DOS下的程序。如果想進壹步學習C,可以看《C陷阱與缺陷》這本書。寫這本書的作者在貝爾工作。他對C非常精通,應該算是大師級人物。如果妳暫時不想深入C,也沒問題,因為這個時候妳可以用C作為編程工具。妳要做的就是多寫代碼,讓自己熟悉C語言。經驗很重要。“經驗是檢驗真理的唯壹途徑。”當然,妳不會紙上談兵。如果妳有了太多的開發經驗,妳就會知道,妳原來在紙上或者電腦上想象的代碼會實現,最終妳會發現很多地方是不合理的,這是妳以前想象不到的。在初學者學習C的過程中,比如妳會看《C程序設計》來學習C,學完每壹章就要完成習題。這是為了測試妳學了什麽,看看妳的應用能力怎麽樣。尤其是編程這個話題很有意思。如果妳有什麽不明白的,可以回到書上的解釋。如果不解釋或者還是不明白,可以問問別人,和他們交流。bbs,QQ或者Google,直到妳搞清楚為止。當妳最終解決問題的時候,我敢打賭妳壹定很興奮或者更興奮。這個時候,知識已經在妳的大腦裏了。
這裏我給妳推薦幾本關於C語言的好書:
c程序設計規範
c語言百科第四版(個人感覺不錯,c標準裏也有提到的東西)
c和指針
C編程語言(經典)
如果妳想看電子書,上面的書在谷歌上很容易找到。
對c語言的初步了解;
對於初學者來說,問題會太多,因為妳的知識面太小。現在我給大家講解壹些C相關的東西。目的是讓妳有明確的方向,安排好學習計劃。專業上,我們是或將是程序員,程序員當然會開發程序。讓我解釋壹下軟件開發的術語:
C,C++,ASM,BASIC和Java都是計算機語言。計算機語言有很多,我就不說了。
Visual C++,Visual Basic,微軟開發的開發環境。開發環境包括:編譯器和庫函數(每壹個C語言編譯器都支持標準庫,他們也會擴充自己的庫,所以很多實現了庫函數的程序員自從對比之後,在切換到不同的開發環境時,壹開始總是不使用,會遇到很多問題)。壹些資源模板等等。視覺就是視覺,其次才是語言。Visual C++支持C和C++兩種語言,根據文件擴展名決定使用哪個編譯器內核。
什麽是“面向對象”和“面向過程”?其實是兩種完全不同的編程思路。C是面向過程的語言,而C++是面向對象的語言。面向對象語言中有“類”這種東西。在c語言中沒有這種東西。對象是從類派生的實例,而類就像壹個模板。
什麽是SDK?SDK是壹個軟件開發工具包。它指的範圍很廣。壹般來說,凡是能和軟件開發過程相關的都屬於它,比如庫文件、參考資料、接口函數,當然,語言也應該屬於它。
DDK是設備驅動程序開發工具包。
Turbo C:這是壹個精致的C語言編譯器。
理論上任何語言都可以在任何操作系統上運行,前提是操作系統支持,也就是我們所說的應用編程接口,比如window API(應用編程接口)。其實微軟定義的接口函數是用來實現Windows的壹些內部功能的。有些對象的描述術語在不同的平臺上是不壹樣的,比如Windows下的“call”常被稱為“call”,而“return”則被稱為“return”。
什麽是算法?首先,妳只需要知道算法實際上是壹段對特定數據進行操作的代碼。妳也可以把它看作是解決問題時所采取的方法和步驟的總稱。對於基本的C程序來說,其實是由數據和算法組成的。
什麽是“數據結構”?如果想系統的講解,需要壹本《數據結構》的書。簡單來說就是程序要處理的數據在內存中存儲和組織的方式,分為物理結構和邏輯結構。邏輯結構是我們抽象後得到的大腦圖像。
什麽是“函數庫”?它們以文件的形式存儲,文件是壹組預定義的函數,我們的程序可以直接調用它們。當然,前提是要包含它的頭文件(庫函數的原型聲明)。這些函數被組合成。在靜態連接過程中。Windows中還有壹個庫,叫做動態連接庫(DLL)。
GUI:也就是“圖形用戶界面”,也就是我們在Windows上看到的。它以菜單欄、滾動條和窗口的形式存在於顯示區域。
GDI:圖形設備接口,從程序員的角度來說,GDI實際上是由數百個函數、數據形式和壹些相關的數據結構組成的。
學習C語言的全過程:
仔細想想。其實學習C語言,首先要學習C語言的基本語法,也就是學習C語言的組成部分。壹部分壹部分學。知識要壹點壹點鞏固。我假設妳學C語言是看《C程序設計》的。我覺得妳應該先仔細看看C編程。這樣妳應該能對整本書和C語言的整體結構有壹個大致清晰的了解。不要以為學習就是看壹本書。妳應該學會記筆記。在記筆記的過程中,妳其實是在學習,從分析、理解、總結知識,到用自己的思維方式寫下來。整個過程就是把書上的知識抽象到自己的腦袋裏。個人感覺學習效果很好。不懂就問。多和別人交流,多思考,遇到問題多思考。妳真的找不出問題在哪裏。現在就問別人,不懂就不要直接問別人。那對妳沒多大好處。其實妳要學會安排壹個適合自己的學習計劃。我粗略估計了壹下,如果妳能每天安靜地花4個小時,認真學習,30天內應該就能掌握C語言了。其實妳大部分學習時間都在看書,而不是對著電腦。在調試妳的代碼之前,把核心代碼寫在紙上,分析壹下:程序的模塊(可以是壹個函數,也可以是多個函數)是由幾個函數實現的,接口是封裝的。哪種數據結構更合適?關鍵在於算法。在發布最終程序之前,最好盡量減少代碼行數。不要只想著多寫代碼。太多的代碼是程序的負擔。妳可以在網上下載壹個文件(chm,C語言的經典例子),裏面大概有上百個經典例子。每個例子都是C語言壹部分的典型應用。花時間研究這個文件中的所有示例代碼,妳最好自己改進代碼。用自己的方式解決。以後妳會發現,妳在寫壹些應用的時候,經常會有壹些算法。會涉及到我之前提到的例子。最後,我覺得可以自己寫C語言標準函數,比如strcpy();strlen();strcat();最好不要太依賴庫函數。
學習C語言的難點:
現在我應該講壹個關鍵環節。很多網友說學C語言難,我覺得C的某些部分更復雜,更難理解。當然,等妳有了豐富的開發經驗之後,這就不再是問題了。下面,我將親自講解壹下我認為學習c時難學的地方,如不正確,請指出:
指針的外觀:
我覺得很多初學者學習指針這壹章是很難的,我就用自己的思路來解釋壹下指針這種特殊的數據類型。
基本變量對大家來說可能不難理解,因為基本變量裏面存儲了同類型的常數。其實指針也是壹個變量。但是,這個變量與基本變量有壹點不同。然後妳問:有什麽區別?我告訴妳,簡單理解,普通變量其實存儲的是同類型的常量,而指針變量存儲的是“同類型變量的第壹個地址”。妳能理解這個嗎?很簡單的解釋,卻不失本質。這是事實。如果妳不理解“同類型變量的首地址”,我可以給妳壹個生動的描述:
浮動變量;//聲明單精度實數類型的變量。
此時,編譯器已經給變量分配了內存空間,結構如下:
__________
| |1001
| -
| |1002
| -
| |1003
| -
| |1004
| -
這就是變量的存儲結構。位16下的浮點占用4個字節,內存地址線性編碼。我們不難看出,Variable的第壹個地址就是他的第壹個單元格的地址,1001。好,繼續往下看:
浮點*指針= & amp可變;//聲明壹個指向變量的指針。
_________
|1001 |這是指針的內存結構。
|_______|
我們的程序可以這樣執行:
變量= 1.0;
直接給變量賦值叫做直接訪問。
您也可以這樣做:
*指針= 1.0;
也可以通過指針變量賦值。前面的*是壹個間接運算符號,意思是尋找指針內部存儲地址標識的內存單元,也就是變量。此時,通過間接訪問實現分配。可以這樣描述:
_ _ _ _ _ _ _(指向變量)_ _ _ _ _ _ _ _
|指針|-& gt;可變的
- -
以上應該是指針實現的基本說明。很多優秀的程序員都說指針是C語言的精髓。的確,很多優秀的程序員在編寫程序的時候非常依賴指針,因為它很方便。其實指針訪問的對象是無限的,前提是我們知道內存地址。所以指針是不安全的,開發網絡程序的時候盡量少用指針。讓我們來看看數組中的指針。
數組中的指針:
簡單解釋壹下數組,數組結構在C中應用廣泛,其實最常用的數組是char類型,主要用於字符串操作。實際上,數組是“同類型變量的有限集合”。我覺得這個應該很好理解。該陣列占用存儲器中的連續存儲單元(具有連續地址)來存儲陣列中的每個元素。該陣列是具有指定長度的預先分配的存儲單元。對於數組元素。它不支持動態內存分配。為了唯壹地確定內存中的數組,需要兩個標識符:入口地址(函數名)和結束標記(“\0”)。有些語言不支持C之類的字符串的結束標記,所以它們必須聲明另壹個變量來標識結束元素的下標。這個數組名實際上是這組存儲單元的第壹個單元。他的地址是整個數組的入口地址。這個時候要明白數組名是指針,理解起來沒有問題。確實在具體操作過程中不允許改變數組名的地址,也不符合實際要求。因此,我們可以理解數組名是const指針(指針常數)。我們可以這樣做:
int數組[10];
int *指針;
指針=數組;
for(I = 0;我& lt10;++i)
指針= = I;
上面的代碼應該沒問題。相同類型的指針對於數組名的任務是完全合格的。完全沒有問題,可以很好的運行。當然,我們可以進壹步編寫這樣的代碼:
保持
for(I = 0;我& lt10;++i)
指針= I;
換成
for(I = 0;我& lt10;++i,指針++)
*指針= I;
抱歉,我記不清了,指針++操作是地址+1還是後移壹個元素的位置。如果是地址+1,上面的代碼將改為:
for(I = 0;我& lt10;++i,指針+sizeof(int))
*指針= I;
如果數組類型是char,會更方便,因為字符串在結束元素後面有壹個結束標記(' \0 ')。下面是壹個簡單的代碼,使用了char指針:
char * my_strcpy(char * dst,const char * src)
{
char * cp = dst
while(* cp++ = * src++);//註意運算符的優先級和組合。
返回(夏令時);//返回新傳遞的指針。
}
上面的代碼實現了轉移字符進行復制的功能。代碼不是很簡潔嗎?如果不需要移動內存塊,完全可以通過交換指針(內存地址)來實現排序操作,其效率應該是非常客觀的。Add:確保指針本身和指針所指向的變量不是壹個單元。