一篇文章幫你規劃C語言從入門到進階學習之路(書籍推薦)

一、C語言自我摸索之路

​ 我是一名自動化的本科生,研究生也是學的控制科學與工程,因爲在自動控制領域很多東西都是涉及的底層的控制,與硬件打交道比較多,所以學習的都是C語言。

初識C語言

​ 首先就是和大家一樣,在大一就學習了C語言,C語言的基礎語法,如何編寫最基本的程序,最後打印出來結果。在這個階段沒覺得C語言用來幹嘛,有什麼用,後來也就漸漸的忘記了。

偶遇C語言

​ 說到偶遇,真的完全是巧合,因爲當時大三想要直接去實驗室的,但是碰巧找的那個老師是做理論的,說我還沒學習自動控制的基礎理論,還是先學學理論,大四在過來。之後看到身邊同學報名了身邊的智能車比賽,自己和他就組隊參加了。所以直到大三參加了恩智浦智能車大賽(最後與國家一等獎失之交臂,作爲大學的遺憾之一),又重新拾起了C語言,這完全是一次巧合,但也正是這一次的偶遇,讓我與c語言結下了不解之緣。在這個時候意識到了自己C語言的學習的欠缺,之前課程中的學習根本用處不大,只是認識了基礎的語法,但因爲那時候一方面比賽,一方面還要兼顧專業課的學習(當然爲了保研,哈哈哈),所以還是秉承着夠用就好的原則,沒有過多追求C語言的知識會的有多深入。

認識C語言

​ 直到大三保研確定之後,我就徹底沒有了課業的壓力。於是開始了重新着手了C語言的深入學習之中。也是不斷的在網上查找各種學習的套路啊,怎麼入門啊,怎麼提高之類的,我也是不斷的看書學習C語言,感覺自己還稍微入門了一點點。也就真正的纔剛剛認識C語言,之後就是暫時轉移到了數據結構以及算法等其他計算機基礎知識的學習,這些在之後的文章之中也會總結。

理解C語言

​ C語言的另一次水平的提高,就是在我準備面試期間,準備的工作崗位就是面向嵌入式軟件方面,所以C語言是其中重要的一部分,我又重新拾起了C語言的學習。在面經和各個公司的面試題中查找自己在知識的盲區,發現自己大四當時自以爲已經真正學會了C語言還是一塌糊塗(學習還是得腳踏實地啊,不能盲目自信),各種面試題根本不會,也就是開始按照面經與筆試的常見考題不斷學習,不斷補足知識的盲區。當然也是憑藉自己的努力與運氣,先後拿到了中興、海康、tplink、vivo、華爲以及一些研究所的offer。個人還是很滿意的。

領悟C語言

​ 在經過面試的一系列考覈之後,我就思考如何去總結C語言呢,C語言到底是學什麼呢?什麼樣纔是學會C語言呢?於是我又重新閱讀了之前的大四當時閱讀的C語言的書,每讀一些,哎這不是C語言筆試面試常考的嘛,這個也是啊。發現原來所有的知識書中都講了,只是那個時候學習沒有抓住重點。這個時候就覺得“參禪之初,看山是山,看水是水;禪有悟時,看山不是山,看水不是水;禪中徹悟,看山仍是山,看水仍是水”也適合於C語言的學習,初學之時C語言好簡單啊,怎麼樣,聽到很多人都說我會C語言啊,本科學過啊;稍微深入學習一點,哎呀好難啊,指針好難啊;最後在大量的學習輸入之後領悟到C語言就是這些內容。通過重新閱讀一遍之前學習的書籍,總結出了自己對於C語言學習之路的見解,所以想分享出來,希望可以爲之後學習C語言提供些許幫助。

二、C語言知識結構與難點解析

​ 先來看看我總結的知識思維導圖
在這裏插入圖片描述

​ 當你學C語言的時候,可能覺得好多內容啊,但是當你把基礎知識(這裏不談編程水平)全部都學了,總是感覺好亂啊,知識很雜,那是因爲你沒有掌握結構化思維,如果按照結構化思維將C語言知識整理爲如上圖所示的結構,就會立刻清晰起來,在把繁雜的知識點一點點細化到這個結構中,你會發現原來C語言也沒有那麼雜,還是很清晰的,看山仍是山,看水仍是水。

​ 對於C語言基礎知識等問題,學習的路徑書籍在後面分享,這裏先談談我對於C語言中一些難點的一些思考與感悟。這部分最好在你學完之後在來體會一下,最好也把你的體會也分享給我。

C語言變量與指針的本質

​ 其實C語言最難理解的東西都說是指針,不論是數組啊,還是指向指針的指針,指針數組,數組指針等等,但是我覺得這些東西的本質都是內存,爲什麼好多底層應用都是用C語言,其中一個重要的因素就是C語言可以直接操作內存,提供更高效的編程。所以在學習指針這部分之前最好先把計算機的體系基礎知識補充一下,至少能區分出來內存和硬盤之間的區別吧,一些人說自己學習軟件的,卻總在說自己手機內存不夠用啊,只有128G,下一次得買256G內存的手機,我覺得這樣肯定編寫不出好程序。也不可能理解C語言的指針的真正的妙用。

​ 所以C語言指針學習其實就是內存的應用,如何通過程序去操作內存。這裏全部以32位的操作系統爲例,內存其實就是按照字節(8位的二進制數)大小爲基本單位,每個字節都會有一個編號,也就是地址,當你訪問這個地址的時候,字節裏的8位二進制數就會被讀出去了,也就是在變量作爲賦值運算符右值的時候。在C語言定義變量的時候,那些類型名如int,char,short等,其實就是在內存中取出相應大小連續字節分配到一起,並且以最低的地址作爲整個變量的地址,比如定義 char c;就會在內存中分配一個字節的內存,而編譯器會把這個變量名替換爲地址,這樣這個變量與內存就關聯起來了。在定義int a;此時就會分配四個字節的內存,現在就相當於把這四個字節連接在一起了,整個四個字節以最低的地址作爲變量的地址。編譯器將地址與a關聯起來,編譯爲彙編之後,還是採用地址訪問的。這就是變量定義的本質。

在這裏插入圖片描述

​ 對於指針來說,其實就是內容裝的是地址而已,對於它的定義,在32位系統中,都是分配四個字節作爲它的內存空間,而對於類型的定義如int *,char *還是void ( p )(int ) 等等,就是定義了指針內存中存在的地址的內存中內容的解析方式。這句話可能比較繞口,來具體解析一下,比如前面定義的兩個變量之後,定義兩個指針,char * ch=&c;int * num=&a;這裏其實編譯器給ch和num分配的內存都是4個字節,也就是爲什麼sizeof(指針)都等於4,其實從內存的角度來看這個問題,就很明白,而不是去死記硬背。這時候的ch這四個字節的內容就是100,num的四個字節的內容就是400,當我們使用去解析指針的時候,這個時候前面對於指針類型的聲明纔會起作用,比如 *ch 就是去訪問地址100也就是變量c的內容,怎麼訪問呢,是取一個字節,兩個字節還是四個字節的內容呢?就是按照指針變量的聲明,char * 的char來訪問,因爲char就是一個字節,所以讀取地址100的內存處的一個字節。對於 *num就是訪問地址400處的內存,訪問幾個字節,你應該知道了。圖中指針是4個字節,簡化了。

在這裏插入圖片描述

​ 介紹到這裏,如果我沒有說明白,還是在看看後面的書在深入理解一下吧。這就是變量與指針的本質,就是內存,但其實好多C語言的書都沒有這麼介紹,我覺得對於指針的理解造成一定的難度。這裏就引出了一個大問題,變量定義的內存在哪個區域呢,爲什麼變量在代碼位置不同,作用域,存活時間都不同呢?這就是C語言的內存分配模型能夠解釋這個問題。

C語言內存分配模型

​ 對於C語言內存的分配模型主要有這麼幾個區域,按照從地址由高到底的順序排列(linux下的內存分配):棧(由上向下生長)、堆(由下向上生長)、靜態存儲區(.bss和.data)、代碼區(.text和.rodata).如下圖所示:
在這裏插入圖片描述

​ 有了這個就可以分析C語言的變量的作用域,存儲類型以及生命週期了。對於在代碼塊內聲明的變量就是局部變量,這樣的變量存儲在棧上,代碼塊結束就會釋放,也是爲什麼局部變量不初始化時隨機值的原因。全局變量和靜態變量都存儲在靜態存儲區,如果初始化不爲0就存放在.data段,如果沒有初始化或者初始化爲0,就會放在.bss段,所以在整個程序運行期間都活着。代碼就是存放在代碼段,一般這個內存區域都是隻讀的,不能向該區域寫。對於動態申請的內存就是分配在堆中。我個人覺得如果你掌握了這個內存空間分配的模型,對於變量的作用域,存儲類型等等爲什麼會與在代碼中聲明的位置有關,理解起來會很有幫助。

C語言的操作符與表達式

​ 這是C語言的另一個難點,其實對於這個理解起來呢,就是結合C語言的優先級來分析,因爲優先級比較多且雜,具體表格可以查閱相關書籍。這裏在網上看過的一個順口溜,可以幫助記憶。
​ 小括中括指向點, (? “()”,"[ ]","->", “.”)
​ 非反後來自加減; (! ~ ++ --)
​ 負類指針有地址,? (-, 類型轉換, , &)?
​ 長度唯一右在前. (sizeof ,單目運算,從右至左)
​ 先乘除,再求餘, (
, /, %)
​ 加減後,左右移, (+, -, <<, >>)
​ 關係運算左爲先. (<, <=, >, >>)
​ 等於還是不等於, (==, !=)
​ 按位運算與異或; (&, ^, | )
​ 邏輯與,邏輯或, (&&, || )
​ 條件運算右至左. (? : )
​ 賦值運算雖然多, (=, +=, -=, *=, /=, %=,>>=, <<=, &=, ^=, |=)
​ 從右至左不會錯; ( 從右至左)
​ 逗號不是停頓符, ( , )
​ 順序求值得結果. (順序求值運算符)
比如 p++,a=1<<2+3;int * p[10]與int (p)[10]等等。
​ 複雜表達式分析方法
​ 我們在定義一個符號時,首先要搞清楚你定義的符號時誰(第一步:找核心)。舉個例子:int p[5]這個式子中p是核心,這裏int、、中括號、分號都是爲了定義p,因此它是核心。找到核心,第二步找結合。舉個例子:int p這裏的核心是p,會和誰結合呢,一個是,一個是分號;,根據一般規律分號不結合,因此p與
結合。p的左邊是int,右邊是分號,因爲分號不結合,因此p與int結合表示p這個指針指向int型的數據。在舉個例子:int p[5]中,核心是p,p左邊是int,右邊是中括號[],根據優先級,p與中括號[]結合成數組。p[]左邊是int,右邊是分號,因爲分號不結合,所以p[]與int結合表示數組中的元素是int型的。如果核心與
號結合,表示核心是指針;如果核心和中括號結合[],表示核心是數組;如果核心與小括號結合(),表示核心是函數。

三、書籍推薦

入門級書籍

​ C語言程序設計——現代方法(第2版)

在這裏插入圖片描述

​ 這本書我覺得非常適合入門,學習C語言的基礎語法,對於入門真的很友好,我在大四重新學習C語言的時候就是學習了這本書,把課後題都親自去敲程序,才真正的入門C語言,能寫出一些小程序了。個人十分推薦,能夠把基礎打牢。

提升書籍

​ C與指針

在這裏插入圖片描述

​ 這本書絕對是神級之做,強烈建議讀透,之前大四讀沒什麼感覺,在經歷過面試的面試題筆試題的洗禮之後,再次閱讀發現都是這本書講過的內容,很適合在有一定的基礎之後進行拔高,對於C語言有更深入的認識。在掌握這本書的細節之後,基本的C語言知識應該就都掌握了,不過一定要腳踏實地去學。

​ C陷阱與缺陷

在這裏插入圖片描述

​ 這本書其實就是講解了一些C語言的易錯點,可以作爲上一本的補充,看看自己還哪裏有知識的盲點。

​ C專家編程

在這裏插入圖片描述

​ 這本書我還真沒看的太懂,畢竟很菜,不是專家。不是很推薦,沒時間可以不讀。

​ 深入理解C指針

在這裏插入圖片描述
在看完前面的c與指針之後,如果還是對指針的理解有些疑問,可以繼續閱讀這本書籍,加深對指針的理解。

加深理解書籍

​ 嵌入式LINUX與物聯網軟件開發 C語言內核深度解析

在這裏插入圖片描述
​ 這本書對於C語言的內存模型講解的十分不錯,包括位操作等,對於前面所說的內存模型理解十分有幫助。

​ C語言深度解剖(第2版)解開程序員面試筆試的祕密

在這裏插入圖片描述

​ 這本書其實很多內容都是參考c與指針的,裏面有作者的一些經驗分享以及面試經驗的分享,裏面還有一套測試題可以用來測試自己C語言的水平。

​ 高質量程序設計指南_C++_C語言(第三版)

​ 這本書也是一本很好的書,裏面介紹了作者在工作中應用C語言和c++的寶貴經驗,對於使用C語言的代碼規範很有幫助。

四、總結

​ 這就是我本人在學習C語言裏的一些經驗,希望能給後來者提供一些參考,節約一些在書海中尋找好書的時間,當然還有很多優秀的書籍,我沒有讀過,但是我相信讀完這些推薦的書籍,你在C語言的理解上肯定會更近一步的,起碼在招聘的C語言基礎部分是沒有問題的。當然,學的知識還是重在實踐,還是要找一些可以應用的項目去學習,把前面學到的c語言知識應用起來,我就是把這些知識應用到修改了之前的實驗室用於項目的代碼中去了。

電子版資源獲取請關注公衆號,輸入C語言獲取。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章