大家好,我是小北。
熟悉的小可愛們都知道,我之前發表過很多關于學習路線的文章,有的有的,還有很多同學催了我好幾次,我來說說如何學習C語言吧。
不,鴿王來了。
我們再說一遍,強調一下C語言的重要性:
1.一圖勝千言
如果你不想讀多余的文字,就看我畫的這張思維導圖:
2、C語言是不是易學難掌握?
很多學生反映C語言很難。
事實上,與C++、Java等更現代的語言相比,C語言本身的語法特征很少,不像C++那樣成了大雜燴。
C語言本身只包含了編程語言最基本的語法,比如變量、if、else、for、while、枚舉、結構體等,再加上指針。
但為什么大家都覺得困難呢?
說一下我大一時覺得困難的原因。 主要有兩點:
1. 庫太少,太原始
用C語言寫一個稍微復雜的項目,首先需要實現數據結構和常用算法,更不用說字符串的序列化了。
例如Redis中的SDS、LIST、ZSET、HASH等。
這對于新手來說其實是極其不友好的。
想做點有趣的事,來吧,先寫一個鏈表?
不過Java中直接新建一個效率不太高。
后來學了才知道,這就是編程的高級形式。 寫個爬蟲直接xx,三言兩語就搞定了。
在C語言中,需要裸露地編寫和發送網絡包、解析HTTP協議、序列化JSON、處理HTTPS(當然也可以導入庫,但是因為C/C++弱雞相當于沒有包管理)也相當麻煩。
這就是學習C的新手很容易被解雇的原因。 他們做不出好玩的東西,都是一堆黑框。
2.內存、指針
另外,指針常常是令C語言初學者頭疼的問題。
其實指針本身并不難,它就是變量的地址。
但問題是地址是什么?
要理解地址,就需要理解內存,但是由于大部分同學都是大一學C語言的,當時并沒有計算機基礎知識,所以理解起來其實有點困難。
內存,其實很簡單,你只要把它當作一個黑盒子,提供讀寫的能力即可。
就像快遞柜一樣,它提供了存儲和放置東西的能力:
在哪里讀 在哪里寫
當然,地址是必須的。 地址與快遞柜上的編號相同,快遞柜的網格是相對于內存中實際存儲的內容而言的。
記住這個快遞柜的照片,其實指針你就明白了。
什么是輔助指針?
也就是將另一個格子的編號放到快遞柜的格子里,對應的是C語言。 例如:
int?a?=?10;
int?*pa?=?&a;
int?**ppa?=?&pa;
ppa指向的內存中存儲的內容是pa的地址,pa中存儲的是a的地址(我不會畫圖,只是打定主意
那你就要問了,指針和二級指針、更多級指針有什么區別呢?
為什么輔助指針需要兩個**?
很簡單,如果不需要兩個**,怎么告訴編譯器這個地方其實是另一塊內存的地址呢?
這樣編譯器就可以做語法檢查,不然誰知道你放的是變量的地址還是另一個指針的地址。
更詳細的內容,其實我在這篇指針文章里講過:
但現在從我的角度來看,我感覺指針很簡單,似乎很容易理解,也許這就是知識詛咒的原因。
知識的詛咒:一旦我們自己知道某件事,我們就很難想象不知道它會是什么樣子。
后來接觸了Java,就像發現了一個新世界。
在C語言中,當你申請一塊內存的時候,你要記得隨時在合適的地方釋放它。
發布不當? 抱歉隨時等你。
忘記釋放? 抱歉,內存泄漏正在等你~
亂寫指針? 抱歉,內存越界在等你~
堆棧內存越界? VS下,火辣辣等你來~
這些事情對于每個C來說一定是司空見慣的。
在 Java 等更高級的語言中,只需創建一個新語言即可。
好了,廢話結束了,下面是系統學習C語言的方法:
第一階段:初學者少看書,多看視頻
這實在是一個血淚的教訓。 大一的時候就傻傻的看課本,然后做課本后面的編程練習。
很難學。 我們都知道,教科書為了保持其嚴謹性和全面性,往往有一個特點,那就是“不講人類語言”。
對于C語言來說,初學者有一個難以克服的困難,那就是很容易遇到各種編譯和鏈接錯誤,而且不知道如何解決:
比如這種很基礎的報錯,但是初學者看到它往往會驚慌失措。
在這種情況下,我的建議是仔細閱讀錯誤消息。 解決方案通常在這些注釋中。 如果解決不了,就復制筆記,到網上搜索一下。
在此階段您將需要三個文件:
對于每一個點,我只推薦一個我認為最合適的,以免你陷入選擇的困境:
CS 50,這是哈佛大學的計算機入門課程。 我忘了我是大一還是大二讀的。 那時我感覺自己就像是撿到了寶一樣。 鏈接如下:
關于尤辛,我至今記憶猶新的一點是,老師講的時候,直接引用了查字典的過程,然后當場把字典撕了。 。 。
另外,本課程采用C語言作為教學語言,這也是非常罕見的。
因為國外很多著名的CS學校的入門課程都會使用類似這樣的語言。
但事實上,你會發現在CS 50中,你不會說太多C語言語法。 C語言只是作為傳達編程思想、帶領你入門計算機的媒介。
而不是教 C.
話不多說,推薦一款我以前在地鐵里用過的,浙江大學翁凱教授,去中文大學MOOC搜一下就可以了,下面是鏈接:
說到這里,我不得不多說幾句翁凱老師。 我看過他的幾門課程,最直觀的感受是:
講解很透徹,聲音很好聽,特別注重細節。 我們來貼一下浙江大學匿名課堂系統翁凱老師的點評:
總之,翁凱老師很想用簡單的方式教給大家計算機和編程語言的內部原理。
《C程序設計語言》,一本書堪稱C語言的圣經。
短短篇幅涵蓋了大部分例子,練習也很經典,從hello world開始,到二分查找、二叉樹、快速排序、哈希表等等,甚至還寫了遞歸下降的詞法分析,幫助您理解復雜的聲明。
不過里面的每一個例子都很難理解,需要一點基礎,但是不妨礙它作為入門書,可以多看幾遍。
順便說一句,學習編程需要多寫,但是很多初學者不知道該寫什么。
這里我舉一些學習C語言基礎語法后可以練習的例子:
就用C語言一遍又一遍地寫鏈表,從最基本的鏈表到插入、刪除、單向、雙向、掛環鏈表。
對鏈表進行反轉、合并、分裂等。
別看基礎,但是很多學生到了高三的時候可能會寫錯。 在這里我們檢驗他們是否足夠細心和合乎邏輯。
如果操作的話會不會斷鏈?
如圖書館管理系統、俄羅斯方塊、貪吃蛇等。
這類代碼大部分是500-1000,會綜合使用函數、文件操作、動態內存、指針等關鍵東西。
第二階段:理解記憶、看書、寫代碼
這個階段需要掌握一些計算機系統知識才能學好。 例如,虛擬地址與操作系統有關,函數調用堆棧與匯編有關。
再比如,很多同學學習了半天還是不知道變量的聲明和定義的區別,以及它們的作用是什么。 這些其實需要了解內存分區。
C語言的核心在于指針和內存。 能否學好、使用好C語言,更多地取決于你是否對計算機結構、存儲、運行原理有扎實的了解。
因此,強烈建議在學習C語言的同時,學習補碼、數字的二進制表示、內存、匯編等知識,尤其是內存和匯編。 這兩個對于深入理解指針和熟練使用很有幫助。
我就不詳細介紹了,要介紹的書都在這張思維導圖中。
《C與指針》和《深入理解C指針》確實是涉及指針方方面面的好書,墻裂推薦。
兩兄弟在理解之后其實并不能幫你提高寫代碼的水平。 主要原因是編譯和鏈接過程中的一些錯誤更加清晰,不會造成混亂。
例如,鏈接過程中常見的錯誤是符號未找到 ( ) 和符號重新定義 ( )
當您熟悉鏈接過程和符號搜索過程后,您將能夠輕松解決相應的錯誤報告。
C語言下是匯編。 如果你懂得匯編,就可以直接脫掉C語言的衣服,看看背后的實現。 比如大家都在討論數組和指針的區別?
你去寫一個程序,然后運行gcc -S,看一下匯編代碼,你會發現沒有什么區別。 。 。
您不需要能夠編寫匯編,但您可以理解并記住其中的一些。 你不需要刻意記住各種指令和尋址方法。
好了,今天的C語言學習之旅就到此結束了。 其實還有很多東西沒有提到,比如Linux C的方向。
主要目的是為了突出C語言本身的學習,不想讓觀眾不知所措,讓大家迷失方向。
另外,我還總結了我推薦的這些書:
學完這套,C語言的基礎問題就不大了。