對于非 CS 專業(yè)的同學(xué),學(xué) C 語言主要是掌握一些基本的編程方法,C 語言只是媒介。
但是對于 CS 科班的同學(xué),C 語言是后續(xù)的計組、體系結(jié)構(gòu)、操作系統(tǒng)、編譯原理等課程的基石,對于 C 語言本身甚至程序設(shè)計語言基礎(chǔ)原理的深入理解都是應(yīng)該掌握的。
一、一圖勝千言
如果你不想看冗余的文字,直接看我畫的這個思維導(dǎo)圖即可:
二、C 語言易學(xué)難精?
很多同學(xué)都反映 C 語言難。實際上,相比 C 、Java 之類的更加現(xiàn)代的語言, C 語言本身的語法特性非常少,不像 C 成了一鍋大雜燴。C 語言本身只包含了編程語言最基本的語法,比如變量、if、else、for、while、枚舉、結(jié)構(gòu)體等,外加一個指針。但是為什么大家都覺得難呢?說下我大一時覺得難的原因吧,主要兩點:1. 庫太少,太原始用 C 語言寫個稍微復(fù)雜點的項目,你需要上來先把數(shù)據(jù)結(jié)構(gòu)、常見算法先實現(xiàn)一遍,更別說字符串,序列化這些了。比如 Redis 里 SDS、LIST、ZSET、HASH等。這其實對新手極其的不友好。想做點有趣的東西,來,先寫個鏈表?而在 Java 里直接 New 一個 LinkedLits、HashMap,簡直不要太高效。再到后來,學(xué)了 Python,才發(fā)現(xiàn)這才是編程的高級形態(tài),寫個爬蟲直接 import xx,幾句話就完事了。而在 C 語言里,你需要裸寫 Socket 發(fā)網(wǎng)絡(luò)包,還要解析 HTTP 協(xié)議,還要序列化 JSON,處理 HTTPS 這些(當(dāng)然,你也可以導(dǎo)入庫,但是由于 C/C 弱雞等同于沒有的包管理,也挺麻煩的。這就是新手學(xué) C 容易被勸退的原因,做不出好玩的東西,全是一堆黑框框。2. 內(nèi)存、指針另外,常另 C 語言初學(xué)者感到頭疼的就是指針了。指針其實本身不難,就是變量的地址嘛。但是問題在于地址是個什么東西?理解地址,就需要理解內(nèi)存,但是鑒于大多數(shù)同學(xué)學(xué)習(xí) C 語言,都是在大一,那時候沒有計算機基礎(chǔ)知識,其實理解起來還是稍微吃力的。內(nèi)存,其實也很簡單啊,你就把它當(dāng)做一個黑盒,提供了讀和寫的能力。就像快遞柜一樣,提供了存東西、放東西的能力:讀哪里?寫哪里?當(dāng)然是需要地址啊,地址就跟快遞柜上的編號一樣,而快遞柜格子里就相對于內(nèi)存中真正存放的內(nèi)容。記住這張快遞柜的照片,其實指針你就理解了。什么是二級指針?就是快遞柜格子里放的是另外一個格子的編號,對應(yīng)到 C 語言舉個例子:int?a?=?10; int?*pa?=?