零基礎必看的C語言基礎知識 你,看了嗎?

當今只有一種語言的性能比C語言強,那就是彙編語言,優化過的C程序的速度大約是彙編的95%-98%。但彙編基本不是常人用的。所以實際上C就是最快的語言。C是

面向過程的編程語言,C++在某種意義上來說是C語言的一個升級版,是面向對象的編程語言。

C語言最牛逼的地方在於開發出來了linux內核。編程語言紛繁多樣,JAVA、Python、PHP、JavaScript、Lisp、Ruby、Go、C#... ...不計其數。但是, 這些語言(另,彙編可以直接寫在C 中)用C實現,運行在C實現的系統中,他們的發明人都是C大牛。C 是 Matrix. 儘管你可能察覺不到它的存在,它卻無處不在。 找一份工作你不必學它,可是學精了你能找任意工作。

而C++,則是一門優秀的程序設計語言,它吸收了C語言的諸多優點,同時又添加了很多現代程序設計語言的新特性,這也是它為什麼能夠成為主流的程序設計語言而長期屹立不倒的原因。

隨著當今世界嵌入式開發的發展、大型算法應用,特別是搜索引擎、雲計算的興起,C語言/C++的用武之地更加壯大。所以,如果你有意向這些領域發展,C語言/C++是你的不二之選。

零基礎必看的C語言基礎知識 你,看了嗎?

考慮到這是一個過來人感覺很基礎,但是對於初學者又覺得困難重重的問題,我想如果這篇文章要想寫得不讓你覺得專業名詞扎堆,內容高深莫測,讀完還是不知所云,那最好的辦法也許是,我們通過溝通的方式把整個「C語言應該怎麼學」的問題由小及大的展開,慢慢來談。

在開始之前,我們先來做一個小測試。

一、小測試,你準備好學習C語言了嗎?

1. 你是否聽說過二進制數,他們是如何進行運算的?(基本的數的進制知識)

2. 你能說出一個最小的計算機系統由哪些部分構成嗎?(基本的計算機結構知識)

3. 計算機是如何存儲圖像的? (數字化原理)

上面這三個問題,能回答的同學舉手。如果你舉手了,那麼我們進入下階段的討論,否則,我將告訴你,你現在最重要的事情,是趕緊找一本《計算機科學導論》把預備知識補充好。

因為——

C語言說到底是一門以內存為中心的編程語言,你能不能學懂它,其實很大程度上不是取決於你智商高低,而是你是否擁有紮實的計算機結構、存儲、運算原理方面的知識!!

在這裡,我想強調,任何新知識的學習都是有一定的前提條件的。C語言學習的前提條件就是,對計算機系統要有一個整體的,科學的基礎認識。 脫離了這個基礎認識,一切都很困難。

所以,有些同學學不會C語言,不是因為他們智商不行,而是因為他們沒有準備好。

我花時間寫這篇文章來給大家講C語言的學習,當然是希望大家真正的學會、學懂C語言,並能夠真正感覺到它的用處,所以很抱歉我不會像培訓機構那樣,告訴你“零基礎”就能夠開始學。但如果你真的按照我說的去做,那麼至少從現在起,你確實是開始有點“學院派”的認真了。

在這篇文章的最後,我推薦了一本我曾經讀過的《計算機科學導論》。這本書可以說是我的啟蒙書,我讀過,真心覺得好,所以推薦給需要的同學。

好了,接下來我們進入C語言的學習過程。

零基礎必看的C語言基礎知識 你,看了嗎?

二、學C語言到底學些什麼—— 「語法」和「函數庫」

C語言學習的關鍵,是要先搞明白,學C語言到底是在學些什麼?

我這麼一問,有的同學就要翻開課本,指著目錄說,我知道我知道,有變量,數據類型,循環語句,函數,哦哦哦,還有指針等等!

很遺憾,如果你以為學習C語言就是學習這些東西,那你得趕緊糾正一下看法,否則接下來的學習會困難重重。因為我曾經就是這麼掉到坑裡的,這種狹隘的觀點讓我浪費了大量的時間去學習瑣碎的細節,又讓我遲遲不能接觸到更重要的知識,結果是眼高手低——知道許多別人不知道的無用知識,但是又寫不出什麼真正像樣的程序來。

所謂「語法」,就是入門教材裡最著重講解的內容。也就是那些所謂的變量、數據類型、分支判斷、循環、函數、指針等等。

這些內容比較枯燥,但是好消息是這些內容並不難,都是一些格式化的東西。只要你多練習,就會自動的刻在你的腦子裡,成為一種下意識的習慣。

但是 「語法」本身其實沒什麼用。因為它只是一種格式規範,你學得再好,也不能引導你寫出厲害的程序。因為在軟件設計中,實際上最核心的部分還是在於其 「函數庫」部分。

零基礎必看的C語言基礎知識 你,看了嗎?

什麼是 「函數庫」?

簡單來說,函數庫就是別人編寫好的C函數,直接提供給你用,你只要調用裡面的函數,就能實現一定的功能。例如 printf() 函數,你肯定知道,只要調用這個函數,你就能夠在那個黑糊糊的窗口裡顯示一段文字。你並不明白 printf() 的內部工作原理,但是你知道你只要按照說明去調用,就能夠實現對應的功能。

這就是函數庫——別人寫好的,打包送到你面前,你可以自由調用來做各種各樣的事情的函數集合。

我來說幾個來自函數庫的函數,例如 CreateWindowEx() 函數可以用來創建一個窗體(這個函數由微軟提供),例如 GaussianBlur() 函數可以用來對一個圖像進行高斯模糊處理(這個函數由 OpenCV 提供),再比如 e鏈接 函數可以創建一個 HTTP 服務程序(這個函數由 libevent 提供)……

其他還有什麼庫函數?太多了。從控制網絡通信,到截取視頻畫面並分析其中的人臉位置,到加解密本地文件,甚至包括微信收發消息,抓取淘寶商品信息……庫函數的數量和有用程度遠遠超乎大家的想象。

誒?你從來沒聽說過還有這些東西?課本里也沒提到?

那是因為你看的是入門教材,著重講解語法,順帶提到了少量的 C 語言自帶的庫函數而已。事實上 C 語言包含的庫函數本身就有不少,但是更多更強大的還是許多第三方庫函數,例如我上面提到的這些。

重點是在於,我想告訴你,庫函數才是你學習C語言並將其應用於實際的關鍵!!

學會調用別人的庫函數,甚至寫出自己的庫函數,都是極其重要的。因為一個函數,本質上就是一個功能單位。你擁有的基礎設施越多,你的發揮空間越大。道理就是這麼簡單。這就是我需要向大家強調的第二個觀點,要想寫出實用的C程序,一大關鍵就是研究並學會使用各種庫函數。

你看見隔壁王二寫了個三維程序能讓一個彩色的立方體在空中旋轉?快找 OpenGL 庫函數來用。什麼?劉大寶寫了個網絡軟件能在局域網裡聊天?快找 Socket 庫來用。

看見了嗎?庫函數有多重要?

但是,函數庫的學習並不是孤立的。許多庫函數背後需要一定的領域知識支撐。同樣如我第一個觀點所述,需要預備知識。學懂一個函數庫,代表的不僅僅是明白如何調用那麼簡單, 而更反映了我們對一個特定領域——網絡、數字圖像、密碼學、操作系統等的認識。

零基礎必看的C語言基礎知識 你,看了嗎?

三、基本的學習過程與一般規律

如我前面所述,C語言學習主要是以語法入門,然後到函數庫。再具體一些來說,包括以下階段:

1. 學習基礎語法

2. 學習簡單的少數幾個C語言自帶的函數

3. 學習一些程序設計的基礎知識(數據結構,算法)

4. 學習更多更強大的C語言自帶的函數

5. 學習一些特定應用領域的基本理論知識(操作系統,數據庫,網絡,圖像……)

6. 應用上一階段學習的到知識進一步學習其他人提供的函數庫(網絡處理、操作系統管理、圖像、密碼學等等)

對於本科階段的同學來說,著重學好1-4,有選擇的學習一下5-6,做一些小作品出來,就已經非常非常不錯了。這就是一般的學習規律。說得很簡短,但是要做到真的很不容易。

零基礎必看的C語言基礎知識 你,看了嗎?

四、書籍推薦

基礎(C語言入門,初學,編程基礎)

1. 《C語言程序設計:現代方法》(第2版)(C Programming: A Modern Approach, 2nd Edition, K.N.King)

2. 《深入理解計算機系統》(修訂版或第2版)(Computer Systems: A Programmer's Perspective, Randal E. Bryant et al),閱讀建議

3. 《C語言程序設計》(第2版)(The C Programming Language, Brian W. Kernighan & Dennis M. Ritchie)

4. 《程序員修煉之道》(The Pragmatic Programmer: From Journeyman to master, Andy Hunt & Dave Thomas)

內核/驅動

1. 《Linux內核設計與實現》(第3版)(Linux Kernel Development, 3rd Edition, Robert Love)

2. 《Linux設備驅動程序》(第3版)(Linux Device Driver, 3rd Edition, Jonathan Corbet et al)

3. 《深入Linux內核架構》(Professional Linux Kernel Architecture, Wolfgang Mauerer)

應用

1. 《UNIX環境高級編程》(Advanced Programming in the UNIX Environment, W. Richard Stevens)

2. 《UNIX網絡編程》(Unix Network Programming, W. Richard Stevens)

進階

1. 《C陷阱與缺陷》(C Traps and Pitfalls, Andrew Koenig)

2. 《C專家編程》(Expert C Programming, Peter van der Linden)

3. 《ARM嵌入式系統開發:軟件設計與優化》(ARM System Developer's Guide: Designing and Optimizing System Software, Andrew Sloss et al)

C語言作為一門非常適合編程入門的語言,打好基礎的重要性不言而喻。所以小編特此奉上這一篇乾貨,希望小夥伴們能從中受益。

我做C語言編程幾年的時間,如果大家對於學習C語言的學習方法,學習路線還有以後發展問題有任何疑問,都可以隨時來諮詢我,關注我的頭條號,私信給我【學習C語言】我會發你係統學習資料以及交流學習的地址。


分享到:


相關文章: