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