本書是學習C語言的入門書籍,內容非常全面,包含C語言基礎知識、流程控制、數組、函數、指針、字符串、結構體、鏈表、文件操作、棧和隊列、自定義頭文件、多文件編譯、Linux下C文件的編譯和鏈接、鏈接庫等知識點。本書并不單純講解理論,還配有大量的程序,每個知識點都結合程序解講。這樣讀者理解起來更加容易,也能夠在遇到實際問題時進行編程。
本書主要針對學習C語言的初學者,即使完全沒有編程基礎,也能夠通過閱讀本書快速掌握C語言的核心知識。
當你拿起本書翻到這一頁時,不管最后買與不買,都要對你說聲謝謝,相遇就是緣分。
為什么要寫這本書
本書是我人生中寫的第一本書,基于我學習C語言的筆記。我從大學本科的時候開始學習C語言,每每學到新的知識或有心得體會時便記下來,就同寫日記一樣。就這樣斷斷續續一直持續到碩士研究生階段,那時差不多寫了7萬多字。我會將自己的筆記分享給很多想學C語言的師弟師妹。在學習的過程中他們發現,我的筆記比其他C語言書籍都更易于理解,講得通俗易懂,風趣幽默。雖然當時只有7萬多字,內容有限,但他們都認為“絕對是入門的好書”。所以我的“前期讀者”以及專業導師都希望我能出版這些筆記。但我覺得還不夠好,內容還不夠充實,也怕誤人子弟,浪費讀者時間,畢竟當時水平有限。但這卻在我心里埋下了一顆想要寫一本好書的種子。
碩士研究生畢業后我應聘到上海起策教育科技公司工作,而我教授的第一門課就是C語言。從此我正式開始了與C語言全天候、長時期的親密接觸,也正式開啟了我要將這本書寫好的歷程。在工作中,我有很多心得體會,或跟同事交流,或得益于很多前輩的教導。于是通過不斷地補充,原先的7萬多字變為現在的34萬多字。在這個過程中我不斷地對它精雕細琢,就像培養一個優秀的孩子一樣,只希望能展現給大家一份優秀的作品。現在我覺得時機到了,可以讓它為更多想學好C語言的讀者做貢獻了。
本書內容
本書是學習C語言的入門書籍,所以一開始對C語言的鋪墊很充分,循序漸進,目的是讓大家對C語言不再陌生,輕松愉快地學習。本書的內容對于入門來說是非常全面的,包括C語言基礎知識、流程控制、數組、函數、指針、字符串、結構體、鏈表、文件操作等主流知識。這幾個知識點是學習C語言的主要框架,對于不同的C語言書籍,區別就在于講得是否詳細,是否能讓每位讀者都掌握。本書中這幾個知識點都講得非常詳細、透徹,是經過無數學弟學妹檢驗過的,也期待著讀者的檢驗。除此之外,本書還增加了很多在工作中需要用到的其他知識,如棧和隊列、自定義頭文件、多文件編譯、Linux下C文件的編譯和鏈接、鏈接庫等。
本書特色
因為本書基于我的學習筆記,所以本書更多的是以初學者的角度編寫的,而且后來一直延續了這種風格,拋開“高大上”、生澀的專業術語,用詞通俗易懂。
因為本書的很多內容是我在參加工作之后總結的,所以都是根據實際工作的需要整理而成。摒棄了脫離實際工作、過時的、不用的、“變態”的用法,大大減輕了讀者學習的壓力,除去了學習道路上的“雜草”,鋪設了一條更好走的捷徑。
此外,本書并不是單純地講理論,而是配有大量的程序。每個知識點都是配合程序講解的,這樣理解起來就更加容易。而且本書沒有那種單獨的、無答案的課后練習題,所有的練習都直接以程序的形式寫在書中,讀者在學習的時候直接練習那些程序即可,而且每個程序都是經過編譯可以直接運行的。此外本書不會提供電子版的代碼,因為學習C語言必須要多動手、多“敲”代碼,所以我希望讀者自己動手。
最后真切地希望本書能成為你編程路上的重要伙伴,為你的成長打下深厚的編程功底。“雖然我可能不是最好的,但我絕對是最用心的。”
限于作者水平有限,書中難免存在不當或疏漏之處,懇請讀者批評指正,并多提出寶貴意見。希望在你的幫助下本書一步步接近完美,謝謝!
吳明杰
2016年9月
查看全部↓
第1章 為什么要學習C語言?1
1.1 C的起源和發展1
1.1.1 計算機語言發展的三個階段1
1.1.2 語言運行速度的比較3
1.1.3 C語言的演變過程3
1.2 C的特點5
1.2.1 C語言的優點5
1.2.2 C語言的缺點6
1.3 C的應用領域7
1.4 C的重要性8
1.5 本章總結9
第2章 怎樣學習C語言?10
2.1 學習C語言的心得10
2.2 學習C語言的目標12
2.3 常見問題答疑13
2.3.1 學習Java為什么建議先學C語言?13
2.3.2 沒學過計算機專業課程能夠學懂C語言嗎?14
2.3.3 英語和數學不好能學好C語言嗎?14
2.4 本章總結16
第3章 Microsoft Visual C++ 6.0的使用17
3.1 為什么要學習VC++6.0?17
3.2 如何創建編程文件?17
3.3 寫一個最簡單的程序22
3.4 要養成時刻按Ctrl+S保存的習慣25
3.5 編譯-鏈接-執行25
3.6 怎樣運行第二個程序?28
3.7 點編譯-鏈接-執行時保存路徑下的文件夾有什么變化?30
3.8 如何編寫多文件程序?31
3.9 如何用VC++6.0調試程序?38
3.10 本章總結40
第4章 C語言認知,先給大家寫一個程序42
第5章 預備知識47
5.1 CPU、內存條、硬盤、顯卡、主板、顯示器之間的關系47
5.1.1 電影是如何運行起來的?47
5.1.2 CPU為什么不能直接操作硬盤卻能直接操作內存?47
5.1.3 內存條的速度為什么比硬盤的速度快?47
5.1.4 為什么不把內存條造的跟硬盤一樣大?48
5.1.5 CPU是如何操作內存的?48
5.1.6 主板的作用49
5.2 HelloWorld程序是如何運行起來的?49
5.3 字節50
5.3.1 什么是字節?50
5.3.2 字節換算50
5.3.3 字節總結51
5.4 進制51
5.4.1 什么是進制?51
5.4.2 進制轉換口算法53
5.4.3 進制轉換公式法54
5.4.4 人類為什么最習慣用十進制?57
5.4.5 計算機為什么用的是二進制?58
5.4.6 進制總結58
5.5 數據類型59
5.5.1 數據類型的分類59
5.5.2 基本數據類型及其所占的字節數61
5.6 常量63
5.6.1 整型常量64
5.6.2 浮點型常量64
5.6.3 字符型常量66
5.7 常量是以什么樣的二進制代碼存儲在計算機中的?67
5.8 補碼67
5.8.1 原碼和反碼68
5.8.2 補碼的兩個核心內容68
5.8.3 int型變量所能存儲的范圍70
5.8.4 int型變量和char型變量是如何進行相互賦值的?72
5.9 什么是ASCII碼?73
5.10 變量74
5.10.1 如何定義變量?74
5.10.2 變量的本質77
5.10.3 為什么要使用變量?78
5.10.4 變量的命名規則78
5.10.5 變量為什么必須要初始化?80
5.10.6 變量總結83
5.11 各類型數據之間的混合運算84
5.12 代碼規范化86
5.12.1 代碼如何寫才能寫規范?86
5.12.2 代碼規范化的好處86
5.12.3 代碼規范化的七大原則87
5.12.4 代碼規范化總結91
5.13 本章總結91
第6章 printf的用法92
6.1 printf的格式93
6.2 輸出控制符95
6.3 %x、%X、%#x、%#X的區別95
6.4 如何輸出“%d”、“\”和“雙引號”?96
6.5 本章總結97
第7章 scanf的用法98
7.1 scanf的用法98
7.2 使用scanf注意事項101
7.2.1 參數的個數一定要對應101
7.2.2 輸入的數據類型一定要和所需要的數據類型一致102
7.2.3 使用scanf之前使用printf提示輸入105
7.3 本章總結105
第8章 運算符和表達式107
8.1 算術運算符107
8.2 關系運算符109
8.3 邏輯運算符109
8.4 賦值運算符113
8.5 運算符的優先級114
8.6 本章總結115
第9章 選擇結構程序設計117
9.1 流程控制117
9.1.1 什么是流程控制?117
9.1.2 流程控制的分類117
9.2 選擇的定義和分類118
9.3 if語句118
9.3.1 if最簡單的用法118
9.3.2 if的范圍問題120
9.3.3 if...else...的用法122
9.3.4 if...else if...else...的用法124
9.3.5 if 舉例--求分數的等級125
9.3.6 if 舉例--三個整數從小到大排序130
9.3.7 if的常見問題解析132
9.4 switch語句136
9.5 本章總結138
第10章 循環控制140
10.1 循環的定義和分類140
10.2 for循環140
10.2.1 for語句的格式140
10.2.2 自增和自減144
10.2.3 練習:編程輸出1!+2!+3!+……+n!的和145
10.2.4 for和if的嵌套使用146
10.2.5 強制類型轉換149
10.2.6 浮點數的存儲所帶來的問題155
10.2.7 多個for循環的嵌套使用159
10.2.8 for循環嵌套編程練習162
10.3 while循環173
10.3.1 while的執行順序173
10.3.2 while和for的比較174
10.3.3 如何看懂一個程序——“試數”176
10.3.4 do...while180
10.3.5 break和continue185
10.4 清空輸入緩沖區187
10.4.1 輸入緩沖區187
10.4.2 %d和%c讀取緩沖區的差別189
10.4.3 用scanf吸收回車191
10.4.4 getchar()192
10.4.5 fflush(stdin)196
10.5 本章總結198
第11章 數組200
11.1 一維數組的使用200
11.1.1一維數組的定義200
11.1.2 一維數組的初始化201
11.1.3 一維數組元素的引用204
11.1.4 如何將數組a賦給數組b?205
11.1.5 如何編程獲取數組的長度?206
11.1.6 練習208
11.1.7 宏定義:#define211
11.1.8 一維數組總結214
11.2 數組倒置算法214
11.3 數組查找算法217
11.3.1 順序查找217
11.3.2 折半查找218
11.4 數組插入、刪除算法221
11.4.1 插入算法221
11.4.2 刪除算法222
11.5 數組
查看全部↓