C語言是計算機專業(yè)中的必修課,也是大多數(shù)編程技術(shù)中的底層技術(shù)。本書作為該領域中的入門教材,在內(nèi)容中涵蓋了C語言中的各方面基礎知識以及實操案例,并且是使用生動的案例對應相關(guān)的知識點,在對應的代碼中做出了詳細的講解。全書一共 17 章,第1~10章介紹了 C 語言的基礎語法用 法,包括:常量、變量、流程控制、數(shù)組、函數(shù)等;第 11~15 章介紹了C語言中的相對高級語法,包 括:指針、數(shù)組指針、指針數(shù)組、函數(shù)指針、指針函數(shù)、函數(shù)指針數(shù)組、枚舉、結(jié)構(gòu)體、聯(lián)合體等; 第16~17章包含一個綜合的實操案例,案例應用到的技術(shù)內(nèi)容相對全面,基本可以包含之前所學習過 的大部分知識內(nèi)容。另外還有一部分筆試練習題。由于考慮到讀者大多數(shù)是在校的大學生。所以針對性地做了這個章節(jié)。目的是讀者能夠熟悉筆試題的出題方式,未來可以更好地應對筆試考試。
本書可作為高等院校計算機專業(yè)教材或者輔助材料,適合對計算機操作有一定認知的編程愛好 者,比如計算機專業(yè)的高等院校新生,同樣也適合目前正在學習或者正準備學習 C 語言的編程愛好者。
本書設計的初衷是為了幫助目前計算機相關(guān)專業(yè)的在校生,更好地學習并真正掌握 C 語言這門優(yōu)秀的編程語言。就像本書的名字一樣,只要能夠認認真真、踏踏實實地把這本書中的所有內(nèi)容都學習一遍,并且都能夠熟練地掌握,就可以做到不掛科。其實不掛科并不是最終的目的,因為這個目標實在是太小也太容易達到了,目的應該是用 C 語言作為編程母語,更方便未來將編程能力平移到任意其他的語言,或者說其他的應用領域。
這本書能夠幫助零基礎的小白通過豐富的代碼實操示例快速地掌握 C 語言的各種語法應用。書中的內(nèi)容將會以第一人稱對話的形式呈現(xiàn),在本書中,你將會獲得一個角色。從現(xiàn)在開始,你的名字叫作小肆,在未來使用本書的過程中,這個名字會高頻率地出現(xiàn)在代碼示例和內(nèi)容講解中,讓讀者學習起來更有代入感。這也和老邪本人制作的課程一樣,采用第一人稱視角聊天的講解方式,相信會讓你的學習效果事半功倍。
在本書中讀者只需要跟著書中的代碼示例進行按部就班的學習,就一定能很輕松地掌握 C 語言這個學科內(nèi)的各種常用知識。本書的特點是利用代碼實操示例得到運行效果,再根據(jù)運行效果反推語法結(jié)構(gòu)以及相關(guān)的一些理論,這也是老邪本人一直以來的教學理念。在技術(shù)學習的道路上,一切脫離了實操的理論、原理都是在學習中的絆腳石。只有通過結(jié)果推導出來的結(jié)論才是能夠理解掌握的,只有真正理解掌握了,才能做到舉一反三,在使用中做到融會貫通。所以在學習編程的初期,不要著急去了解什么原理、理論之類晦澀難懂的內(nèi)容,先把注意力放在實操環(huán)節(jié)。經(jīng)過一定的積累到了該了解的時候,你就會驚喜地發(fā)現(xiàn)自己已經(jīng)具備了歸納總結(jié)能力,并且通過自己的歸納總結(jié)得到的都是正確的結(jié)論。通過這本書,老邪不僅僅要教會 C 語言,更重要的是教會學習技術(shù)的方法。掌握了這種方法,養(yǎng)成了正確的學習習慣之后,未來再去學習任何的一門技術(shù)都可以事半功倍,輕松上手!
明確了基本的學習思路之后,接下來就要了解一下老邪針對本書使用的學習方法。老邪在 IT 教培行業(yè)從教 17 年。一直強調(diào)的都是一帶三 的學習方法,這個學習方法在之前出版的《碼解Java》一書中也做了推薦與介紹,接下來就具體地描述一下這個方法。
一帶三中的一指的是需要自己手寫一遍代碼。對!你沒看錯,手寫,就是手寫,用筆在本上寫。學習的本質(zhì)就是先輸入再輸出,看了一遍我給你的內(nèi)容,這就是輸入。這么多年來你最熟悉的輸出方式就是用筆,而不是用鍵盤。在學習編程的初期,很多新手小白甚至連鍵盤的使用都不是很熟練,何況還要頻繁地在代碼中切換大小寫,而且還有各種會經(jīng)常出現(xiàn)在代碼中的標點符號,比如:!@#$%^&*()_ ~<><<>>;/ : 等等。前期如果直接使用鍵盤去敲代碼,鍵盤在很大程度上會牽扯你的注意力,所以我的要求是必須用筆,以手寫的方式至少寫一遍代碼。這樣就會最大程度地對代碼本身的邏輯和結(jié)構(gòu)有一個初步的認識,并且可以更專注于代碼本身的邏輯和結(jié)構(gòu)。不要忽略了物理層面的表現(xiàn)力。人們經(jīng)常會忘記電腦里面的文件存放的位置、文件的名字等信息,但是我相信你一定能想起來最后一次用筆寫的最后兩個字是什么?甚至可以記起是寫在了紙上還是本上?你是站著、坐著、蹲著、趴著還是撅著寫的?你甚至還會想起是寫在一張紙的左上角還是右下角?如果你的記性再好一點兒,甚至會想起來用的是鋼筆、鉛筆還是圓珠筆。沒錯,這就是物理層面的表現(xiàn)力。這么有助于我們記憶的一種方式,往往被大家所忽略。本書用了這么多篇幅來強調(diào)手寫的重要性,可以看出本人對于學習中的這個環(huán)節(jié)是多么地看重。所以如果你想要真正地學會這門技術(shù),就一定要按照我告訴你的方式一步一步去操作。
一帶三中的三,指的是在鍵盤上敲至少三遍。注意我們在使用鍵盤敲代碼的時候,不要在屏幕上打開隨書附贈的源碼文件。如果照著源碼敲代碼的話,這種敲代碼的方式實際上就是在練打字。想象一下,如果讓你用金山打字通隨機找一篇陌生的英文文章照著打三遍,能記住多少?80%?50%?還是30%……所以照著敲是最不可取的方法。
第一遍用鍵盤敲代碼的時候應該憑著自己的回憶和理解去敲,當然大概率會有記不住的地方,這個時候你就可以利用之前手寫的代碼去填充殘缺的記憶,完成第一遍代碼的編寫,最終要能夠成功地編譯并運行代碼。寫完第一遍代碼之后不要保存,更不要直接刪除,接下來你要做的是將代碼的每一行根據(jù)之前的理解,添加上相應的注釋。然后再把代碼部分刪除,但是要保留下來注釋部分。這個時候經(jīng)過了第一遍的手寫,然后又敲了一遍代碼,最后又添加了一次注釋,相當于已經(jīng)復習三遍代碼了。
接下來就開始手敲第二遍代碼,這個時候因為有注釋在,所以我們寫代碼的感覺類似于漢譯英了。而且有了之前三遍的復習效果作為加持,這一次完成得相對就會簡單很多,也會在一定程度上為自己的學習增加信心。那么這次敲完代碼之后,相當于是又復習了一次代碼。此時我們可以把所有的內(nèi)容,包括代碼和注釋全部刪除,又保留一個空白的文件。
最后我們開始手敲第三遍代碼,如果這一次你能通過自己的理解和記憶獨立完成代碼編寫。那么你才算是真正地吸收和掌握了這個代碼。相反如果這一次你還是不能自己獨立完成代碼編寫,這就說明你對這個代碼的理解還不夠,而且有些關(guān)鍵的點并沒有記住。任何的理解都是建立在能記住的基礎上,如果你連記都記不住,還談什么理解。所以如果你不能獨立完成代碼編寫,那么還要繼續(xù)多敲幾遍,一直到能獨立完成為止。
記住我下面要說的話:學習編程也好,學習其他的技術(shù)也好,我們的最終目的是學會,而不是學完,我們要學得扎實,一步一個腳印,而不是為了快!所以學習技術(shù)最好的捷徑就是不走捷徑,當你開始尋找捷徑的那一刻開始,其實你就已經(jīng)開始走彎路了。
那么從現(xiàn)在開始整理狀態(tài),調(diào)整好自己的心態(tài),準備和老邪一起迎接一個新的學習階段。我們開始吧!
本書提供了配套的代碼資源、筆試練習題和讀者服務群,可以掃描下方二維碼獲取資源或進群。
作者
2025年元月
王冰,筆名IT老邪,IT教培行業(yè)從業(yè)17年,累計授課時長超過兩萬小時,從業(yè)期間學員數(shù)以萬計。
授課內(nèi)容涵蓋C/C 、Java、Python等主流開發(fā)語言,涉及就業(yè)方向包括嵌入式開發(fā)、Java、Web全棧開發(fā)、Web前端開發(fā)、PHP全棧開發(fā)等。
曾獲得高校畢業(yè)生就業(yè)協(xié)會頒發(fā)的雙師型導師認證,曾任某新三板教培機構(gòu)教學總監(jiān)、區(qū)域校長以及多個高校的外聘講師。
第1章 C/C 語言簡介與環(huán)境搭建 1
1.1 C語言和C 1
1.2 C語言的特點 1
1.3 C語言的用途 1
1.4 C語言的開發(fā)工具 2
1.4.1 集成開發(fā)工具 2
1.4.2 代碼編輯器 3
1.5 環(huán)境安裝 3
1.6 C/C 中的通用基礎語法 9
1.7 本章小結(jié) 10
第2章 C語言中的常量與
變量 11
2.1 常量變量在C語言中的作用 11
2.2 常量和變量相關(guān)關(guān)鍵詞 11
2.3 C語言中常量的使用 12
2.3.1 在代碼中用 const 定義并使
用常量 12
2.3.2 C語言中常量的其他變
現(xiàn)形式與使用 12
2.4 C語言中變量的使用 15
2.4.1 變量的定義 15
2.4.2 變量的使用 16
2.5 認識計算機中的內(nèi)存存儲 20
2.5.1 計算機中的存儲單位 20
2.5.2 不同類型變量在內(nèi)存中
的存儲情況 21
2.5.3 static 關(guān)鍵詞 22
2.6 本章小結(jié) 22
第3章 C語言中的運算符 24
3.1 C語言中的常用運算符以及
分類 24
3.2 算術(shù)運算符 25
3.2.1 算術(shù)運算符的功能 25
3.2.2 算術(shù)運算符示例 25
3.3 邏輯運算符 29
3.3.1 邏輯運算符的功能 29
3.3.2 程序代碼中的真與假 29
3.3.3 邏輯運算符示例 30
3.4 關(guān)系運算符 33
3.4.1 關(guān)系運算符的功能 33
3.4.2 關(guān)系運算符示例 33
3.5 位運算符 34
3.5.1 位運算符的功能 34
3.5.2 位運算符示例 34
3.6 選擇運算符 38
3.6.1 選擇運算符的功能 38
3.6.2 選擇運算符示例 38
3.7 求字節(jié)運算符 40
3.7.1 求字節(jié)運算符的功能 40
3.7.2 求字節(jié)運算符示例 40
3.8 指針運算符 41
3.8.1 指針運算符的功能 41
3.8.2 指針運算符示例 41
3.9 賦值運算符 43
3.9.1 賦值運算符的功能 43
3.9.2 賦值運算符示例 44
3.10 自增自減運算符 45
3.10.1 自增自減運算符功能 45
3.10.2 自增自減運算符示例 45
3.11 運算符優(yōu)先級 46
3.12 本章小結(jié) 47
第4章 C語言中的流程控制
判斷 48
4.1 代碼的運行順序 48
4.2 判斷、選擇結(jié)構(gòu) 48
4.2.1 關(guān)鍵詞 48
4.2.2 流程圖 49
4.2.3 if 的單獨使用 49
4.2.4 if…else語句的使用 50
4.2.5 else…if 的使用 52
4.2.6 if 的嵌套使用 55
4.3 綜合代碼示例 56
4.3.1 判斷奇偶數(shù) 56
4.3.2 判斷平閏年 58
4.4 本章小結(jié) 59
第5章 C語言中的流程控制
分支 60
5.1 分支結(jié)構(gòu)流程圖 60
5.2 分支結(jié)構(gòu)的標準語法 61
5.3 switch 基礎示例 61
5.4 break 的用法 62
5.5 default 的用法 65
5.6 綜合代碼示例 67
5.6.1 成績等級劃分 67
5.6.2 簡易計算器 68
5.6.3 某月有多少天 69
5.6.4 凱撒日期 70
5.7 本章小結(jié) 73
第6章 C語言中的流程控制
循環(huán) 74
6.1 循環(huán)結(jié)構(gòu)簡介 74
6.1.1 什么是循環(huán)結(jié)構(gòu) 74
6.1.2 為什么要使用循環(huán) 74
6.2 while 循環(huán) 75
6.2.1 while 標準語法 75
6.2.2 while 的流程圖 75
6.2.3 while 的基本使用示例 76
6.3 do…while 循環(huán) 78
6.3.1 do…while 標準語法 78
6.3.2 do…while 的流程圖 79
6.3.3 do…while 的基本使用
示例 79
6.4 for 循環(huán) 80
6.4.1 for 循環(huán)標準語法 80
6.4.2 for 循環(huán)的流程圖 81
6.4.3 for 的基本使用示例 81
6.5 break 與 continue 85
6.5.1 break 在循環(huán)中的使用 85
6.5.2 continue 在循環(huán)中的
使用 88
6.6 循環(huán)的嵌套使用 89
6.7 綜合代碼示例 90
6.8 本章小結(jié) 97
第7章 C語言中的數(shù)組 98
7.1 什么是數(shù)組 98
7.1.1 數(shù)組的簡介 98
7.1.2 為什么要使用數(shù)組 99
7.2 數(shù)組的聲明與初始化 99
7.2.1 數(shù)組的聲明 99
7.2.2 數(shù)組的初始化 100
7.2.3 初始化以后的數(shù)組 101
7.3 數(shù)組中元素的引用 102
7.3.1 元素引用方法 102
7.3.2 數(shù)組的遍歷 103
7.4 多維數(shù)組 104
7.4.1 什么是多為數(shù)組 104
7.4.2 二維數(shù)組的定義與初
始化 104
7.4.3 二維數(shù)組元素的引 107
7.4.4 二維數(shù)組的遍歷 108
7.5 綜合代碼示例 109
7.6 本章小結(jié) 124
第8章 C語言中的字符串 125
8.1 字符數(shù)組 125
8.2 字符串 126
8.2.1 字符串的定義 126
8.2.2 字符串的初始化 130
8.2.3 字符串的輸入輸出 133
8.3 綜合代碼示例 134
8.4 本章小結(jié) 141
第9章 C語言中的函數(shù) 142
9.1 什么是函數(shù) 142
9.1.1 函數(shù)的簡介 142
9.1.2 函數(shù)的基本概念 142
9.1.3 為什么要使用函數(shù) 143
9.2 函數(shù)的定義 144
9.2.1 帶參函數(shù)帶返回值 144
9.2.2 無參帶返回值 145
9.2.3 帶參無返回值 145
9.2.4 無參無返回值 146
9.3 函數(shù)的調(diào)用 146
9.4 全局變量與局部變量 148
9.5 函數(shù)的傳參 152
9.5.1 如何傳參 152
9.5.2 傳參順序 154
9.6 遞歸調(diào)用 155
9.6.1 遞歸的使用 155
9.6.2 遞歸小示例 158
9.7 main()函數(shù)怎么用 159
9.8 綜合代碼示例 161
9.9 本章小結(jié) 166
第10章 C語言中的庫
函數(shù) 167
10.1 stdio.h標準輸入輸出頭
文件 167
10.2 time.h 時間和日期函數(shù)頭
文件 171
10.3 stdlib.h 標準庫函數(shù)頭文件 173
10.4 string.h 字符串函數(shù)頭文件 174
10.5 math.h 數(shù)學函數(shù)頭文件 177
10.6 本章小結(jié) 181
第11章 C語言中的指針 182
11.1 指針簡介 182
11.2 指針的聲明 183
11.2.1 指針相關(guān)的運算符 183
11.2.2 語法結(jié)構(gòu) 183
11.3 直接訪問與間接訪問 184
11.3.1 直接訪問 184
11.3.2 間接訪問 185
11.4 指針與數(shù)組 185
11.5 指針與字符串 187
11.6 指針作為函數(shù)的參數(shù) 187
11.6.1 值傳遞 188
11.6.2 址傳遞 189
11.7 指針的高級應用 191
11.7.1 多級指針 191
11.7.2 指針數(shù)組 193
11.7.3 數(shù)組指針 198
11.7.4 指針函數(shù) 200
11.7.5 函數(shù)指針 202
11.8 特殊指針 205
11.8.1 空指針 205
11.8.2 void指針 205
11.9 本章小結(jié) 207
第12章 C語言中的結(jié)構(gòu)體、聯(lián)合體與枚舉 208
12.1 結(jié)構(gòu)體簡介 208
12.2 結(jié)構(gòu)體的使用 208
12.2.1 結(jié)構(gòu)體的定義 208
12.2.2 結(jié)構(gòu)體變量 210
12.2.3 結(jié)構(gòu)體的初始化與
賦值 212
12.2.4 結(jié)構(gòu)體成員訪問 213
12.2.5 結(jié)構(gòu)體大小 217
12.2.6 結(jié)構(gòu)體的位域 220
12.2.7 結(jié)構(gòu)體嵌套定義 223
12.3 結(jié)構(gòu)體作為函數(shù)的參數(shù) 224
12.4 結(jié)構(gòu)體指針 226
12.5 結(jié)構(gòu)體數(shù)組 228
12.6 聯(lián)合體簡介 230
12.7 聯(lián)合體的使用 230
12.8 枚舉簡介 232
12.9 枚舉的定義和成員引用 233
12.10 枚舉的應用場景 234
12.11 本章小結(jié) 236
第13章 C 語言中的內(nèi)存
管理 237
13.1 內(nèi)存管理簡介 237
13.2 內(nèi)存管理相關(guān)函數(shù) 238
13.3 綜合代碼示例 243
13.4 鏈表的基本操作 245
13.4.1 單向鏈表 245
13.4.2 雙向鏈表 249
13.5 本章小結(jié) 252
第14章 C語言中的文件
處理 253
14.1 文件處理相關(guān)函數(shù) 253
14.1.1 文件操作簡介 253
14.1.2 文件的讀寫操作 255
14.1.3 文件的拷貝操作 258
14.1.4 文件指針 262
14.4.5 文件的其他操作 266
14.2 綜合代碼示例 266
14.3 本章小結(jié) 269
第15章 C語言中的預
處理 270
15.1 預處理簡介 270
15.2 頭文件包含 270
15.2.1 多文件編譯 271
15.2.2 外部變量的引用 275
15.3 gcc 編譯器 276
15.3.1 gcc 編譯器簡介 276
15.3.2 GCC 編譯器的使用 277
15.4 宏 280
15.4.1 簡單的宏替換 281
15.4.2 帶參宏 282
15.4.3 串行化 282
15.4.4 連接符 283
15.4.5 斷言宏 283
15.4.6 預處理編譯 284
15.5 條件編譯 285
15.6 本章小結(jié) 287
第16章 綜合示例 289
16.1 MVC 設計模式 289
16.2 項目需求 291
16.3 項目源碼實現(xiàn) 291
16.3.1 項目文件結(jié)構(gòu) 291
16.3.2 源代碼時間及解析 292
16.4 本章小結(jié) 302