C語言是計(jì)算機(jī)專業(yè)中的必修課,也是大多數(shù)編程技術(shù)中的底層技術(shù)。本書作為該領(lǐng)域中的入門教材,在內(nèi)容中涵蓋了C語言中的各方面基礎(chǔ)知識以及實(shí)操案例,并且是使用生動的案例對應(yīng)相關(guān)的知識點(diǎn),在對應(yīng)的代碼中做出了詳細(xì)的講解。全書一共 17 章,第1~10章介紹了 C 語言的基礎(chǔ)語法用 法,包括:常量、變量、流程控制、數(shù)組、函數(shù)等;第 11~15 章介紹了C語言中的相對高級語法,包 括:指針、數(shù)組指針、指針數(shù)組、函數(shù)指針、指針函數(shù)、函數(shù)指針數(shù)組、枚舉、結(jié)構(gòu)體、聯(lián)合體等; 第16~17章包含一個(gè)綜合的實(shí)操案例,案例應(yīng)用到的技術(shù)內(nèi)容相對全面,基本可以包含之前所學(xué)習(xí)過 的大部分知識內(nèi)容。另外還有一部分筆試練習(xí)題。由于考慮到讀者大多數(shù)是在校的大學(xué)生。所以針對性地做了這個(gè)章節(jié)。目的是讀者能夠熟悉筆試題的出題方式,未來可以更好地應(yīng)對筆試考試。
本書可作為高等院校計(jì)算機(jī)專業(yè)教材或者輔助材料,適合對計(jì)算機(jī)操作有一定認(rèn)知的編程愛好 者,比如計(jì)算機(jī)專業(yè)的高等院校新生,同樣也適合目前正在學(xué)習(xí)或者正準(zhǔn)備學(xué)習(xí) C 語言的編程愛好者。
編程實(shí)例幫助學(xué)習(xí)C語言語法規(guī)則
本書設(shè)計(jì)的初衷是為了幫助目前計(jì)算機(jī)相關(guān)專業(yè)的在校生,更好地學(xué)習(xí)并真正掌握 C 語言這門優(yōu)秀的編程語言。就像本書的名字一樣,只要能夠認(rèn)認(rèn)真真、踏踏實(shí)實(shí)地把這本書中的所有內(nèi)容都學(xué)習(xí)一遍,并且都能夠熟練地掌握,就可以做到不掛科。其實(shí)不掛科并不是最終的目的,因?yàn)檫@個(gè)目標(biāo)實(shí)在是太小也太容易達(dá)到了,目的應(yīng)該是用 C 語言作為編程母語,更方便未來將編程能力平移到任意其他的語言,或者說其他的應(yīng)用領(lǐng)域。
這本書能夠幫助零基礎(chǔ)的小白通過豐富的代碼實(shí)操示例快速地掌握 C 語言的各種語法應(yīng)用。書中的內(nèi)容將會以第一人稱對話的形式呈現(xiàn),在本書中,你將會獲得一個(gè)角色。從現(xiàn)在開始,你的名字叫作小肆,在未來使用本書的過程中,這個(gè)名字會高頻率地出現(xiàn)在代碼示例和內(nèi)容講解中,讓讀者學(xué)習(xí)起來更有代入感。這也和老邪本人制作的課程一樣,采用第一人稱視角聊天的講解方式,相信會讓你的學(xué)習(xí)效果事半功倍。
在本書中讀者只需要跟著書中的代碼示例進(jìn)行按部就班的學(xué)習(xí),就一定能很輕松地掌握 C 語言這個(gè)學(xué)科內(nèi)的各種常用知識。本書的特點(diǎn)是利用代碼實(shí)操示例得到運(yùn)行效果,再根據(jù)運(yùn)行效果反推語法結(jié)構(gòu)以及相關(guān)的一些理論,這也是老邪本人一直以來的教學(xué)理念。在技術(shù)學(xué)習(xí)的道路上,一切脫離了實(shí)操的理論、原理都是在學(xué)習(xí)中的絆腳石。只有通過結(jié)果推導(dǎo)出來的結(jié)論才是能夠理解掌握的,只有真正理解掌握了,才能做到舉一反三,在使用中做到融會貫通。所以在學(xué)習(xí)編程的初期,不要著急去了解什么原理、理論之類晦澀難懂的內(nèi)容,先把注意力放在實(shí)操環(huán)節(jié)。經(jīng)過一定的積累到了該了解的時(shí)候,你就會驚喜地發(fā)現(xiàn)自己已經(jīng)具備了歸納總結(jié)能力,并且通過自己的歸納總結(jié)得到的都是正確的結(jié)論。通過這本書,老邪不僅僅要教會 C 語言,更重要的是教會學(xué)習(xí)技術(shù)的方法。掌握了這種方法,養(yǎng)成了正確的學(xué)習(xí)習(xí)慣之后,未來再去學(xué)習(xí)任何的一門技術(shù)都可以事半功倍,輕松上手!
明確了基本的學(xué)習(xí)思路之后,接下來就要了解一下老邪針對本書使用的學(xué)習(xí)方法。老邪在 IT 教培行業(yè)從教 17 年。一直強(qiáng)調(diào)的都是一帶三 的學(xué)習(xí)方法,這個(gè)學(xué)習(xí)方法在之前出版的《碼解Java》一書中也做了推薦與介紹,接下來就具體地描述一下這個(gè)方法。
一帶三中的一指的是需要自己手寫一遍代碼。對!你沒看錯,手寫,就是手寫,用筆在本上寫。學(xué)習(xí)的本質(zhì)就是先輸入再輸出,看了一遍我給你的內(nèi)容,這就是輸入。這么多年來你最熟悉的輸出方式就是用筆,而不是用鍵盤。在學(xué)習(xí)編程的初期,很多新手小白甚至連鍵盤的使用都不是很熟練,何況還要頻繁地在代碼中切換大小寫,而且還有各種會經(jīng)常出現(xiàn)在代碼中的標(biāo)點(diǎn)符號,比如:!@#$%^&*()_ ~<><<>>;/ : 等等。前期如果直接使用鍵盤去敲代碼,鍵盤在很大程度上會牽扯你的注意力,所以我的要求是必須用筆,以手寫的方式至少寫一遍代碼。這樣就會最大程度地對代碼本身的邏輯和結(jié)構(gòu)有一個(gè)初步的認(rèn)識,并且可以更專注于代碼本身的邏輯和結(jié)構(gòu)。不要忽略了物理層面的表現(xiàn)力。人們經(jīng)常會忘記電腦里面的文件存放的位置、文件的名字等信息,但是我相信你一定能想起來最后一次用筆寫的最后兩個(gè)字是什么?甚至可以記起是寫在了紙上還是本上?你是站著、坐著、蹲著、趴著還是撅著寫的?你甚至還會想起是寫在一張紙的左上角還是右下角?如果你的記性再好一點(diǎn)兒,甚至?xí)肫饋碛玫氖卿摴P、鉛筆還是圓珠筆。沒錯,這就是物理層面的表現(xiàn)力。這么有助于我們記憶的一種方式,往往被大家所忽略。本書用了這么多篇幅來強(qiáng)調(diào)手寫的重要性,可以看出本人對于學(xué)習(xí)中的這個(gè)環(huán)節(jié)是多么地看重。所以如果你想要真正地學(xué)會這門技術(shù),就一定要按照我告訴你的方式一步一步去操作。
一帶三中的三,指的是在鍵盤上敲至少三遍。注意我們在使用鍵盤敲代碼的時(shí)候,不要在屏幕上打開隨書附贈的源碼文件。如果照著源碼敲代碼的話,這種敲代碼的方式實(shí)際上就是在練打字。想象一下,如果讓你用金山打字通隨機(jī)找一篇陌生的英文文章照著打三遍,能記住多少?80%?50%?還是30%……所以照著敲是最不可取的方法。
第一遍用鍵盤敲代碼的時(shí)候應(yīng)該憑著自己的回憶和理解去敲,當(dāng)然大概率會有記不住的地方,這個(gè)時(shí)候你就可以利用之前手寫的代碼去填充殘缺的記憶,完成第一遍代碼的編寫,最終要能夠成功地編譯并運(yùn)行代碼。寫完第一遍代碼之后不要保存,更不要直接刪除,接下來你要做的是將代碼的每一行根據(jù)之前的理解,添加上相應(yīng)的注釋。然后再把代碼部分刪除,但是要保留下來注釋部分。這個(gè)時(shí)候經(jīng)過了第一遍的手寫,然后又敲了一遍代碼,最后又添加了一次注釋,相當(dāng)于已經(jīng)復(fù)習(xí)三遍代碼了。
接下來就開始手敲第二遍代碼,這個(gè)時(shí)候因?yàn)橛凶⑨屧,所以我們寫代碼的感覺類似于漢譯英了。而且有了之前三遍的復(fù)習(xí)效果作為加持,這一次完成得相對就會簡單很多,也會在一定程度上為自己的學(xué)習(xí)增加信心。那么這次敲完代碼之后,相當(dāng)于是又復(fù)習(xí)了一次代碼。此時(shí)我們可以把所有的內(nèi)容,包括代碼和注釋全部刪除,又保留一個(gè)空白的文件。
最后我們開始手敲第三遍代碼,如果這一次你能通過自己的理解和記憶獨(dú)立完成代碼編寫。那么你才算是真正地吸收和掌握了這個(gè)代碼。相反如果這一次你還是不能自己獨(dú)立完成代碼編寫,這就說明你對這個(gè)代碼的理解還不夠,而且有些關(guān)鍵的點(diǎn)并沒有記住。任何的理解都是建立在能記住的基礎(chǔ)上,如果你連記都記不住,還談什么理解。所以如果你不能獨(dú)立完成代碼編寫,那么還要繼續(xù)多敲幾遍,一直到能獨(dú)立完成為止。
記住我下面要說的話:學(xué)習(xí)編程也好,學(xué)習(xí)其他的技術(shù)也好,我們的最終目的是學(xué)會,而不是學(xué)完,我們要學(xué)得扎實(shí),一步一個(gè)腳印,而不是為了快!所以學(xué)習(xí)技術(shù)最好的捷徑就是不走捷徑,當(dāng)你開始尋找捷徑的那一刻開始,其實(shí)你就已經(jīng)開始走彎路了。
那么從現(xiàn)在開始整理狀態(tài),調(diào)整好自己的心態(tài),準(zhǔn)備和老邪一起迎接一個(gè)新的學(xué)習(xí)階段。我們開始吧!
本書提供了配套的代碼資源、筆試練習(xí)題和讀者服務(wù)群,可以掃描下方二維碼獲取資源或進(jìn)群。
作者
2025年元月
王冰,筆名IT老邪,IT教培行業(yè)從業(yè)17年,累計(jì)授課時(shí)長超過兩萬小時(shí),從業(yè)期間學(xué)員數(shù)以萬計(jì)。
授課內(nèi)容涵蓋C/C 、Java、Python等主流開發(fā)語言,涉及就業(yè)方向包括嵌入式開發(fā)、Java、Web全棧開發(fā)、Web前端開發(fā)、PHP全棧開發(fā)等。
曾獲得高校畢業(yè)生就業(yè)協(xié)會頒發(fā)的雙師型導(dǎo)師認(rèn)證,曾任某新三板教培機(jī)構(gòu)教學(xué)總監(jiān)、區(qū)域校長以及多個(gè)高校的外聘講師。
第1章 C/C 語言簡介與環(huán)境搭建 1
1.1 C語言和C 1
1.2 C語言的特點(diǎn) 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 中的通用基礎(chǔ)語法 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 認(rèn)識計(jì)算機(jī)中的內(nèi)存存儲 20
2.5.1 計(jì)算機(jī)中的存儲單位 20
2.5.2 不同類型變量在內(nèi)存中
的存儲情況 21
2.5.3 static 關(guān)鍵詞 22
2.6 本章小結(jié) 22
第3章 C語言中的運(yùn)算符 24
3.1 C語言中的常用運(yùn)算符以及
分類 24
3.2 算術(shù)運(yùn)算符 25
3.2.1 算術(shù)運(yùn)算符的功能 25
3.2.2 算術(shù)運(yùn)算符示例 25
3.3 邏輯運(yùn)算符 29
3.3.1 邏輯運(yùn)算符的功能 29
3.3.2 程序代碼中的真與假 29
3.3.3 邏輯運(yùn)算符示例 30
3.4 關(guān)系運(yùn)算符 33
3.4.1 關(guān)系運(yùn)算符的功能 33
3.4.2 關(guān)系運(yùn)算符示例 33
3.5 位運(yùn)算符 34
3.5.1 位運(yùn)算符的功能 34
3.5.2 位運(yùn)算符示例 34
3.6 選擇運(yùn)算符 38
3.6.1 選擇運(yùn)算符的功能 38
3.6.2 選擇運(yùn)算符示例 38
3.7 求字節(jié)運(yùn)算符 40
3.7.1 求字節(jié)運(yùn)算符的功能 40
3.7.2 求字節(jié)運(yùn)算符示例 40
3.8 指針運(yùn)算符 41
3.8.1 指針運(yùn)算符的功能 41
3.8.2 指針運(yùn)算符示例 41
3.9 賦值運(yùn)算符 43
3.9.1 賦值運(yùn)算符的功能 43
3.9.2 賦值運(yùn)算符示例 44
3.10 自增自減運(yùn)算符 45
3.10.1 自增自減運(yùn)算符功能 45
3.10.2 自增自減運(yùn)算符示例 45
3.11 運(yùn)算符優(yōu)先級 46
3.12 本章小結(jié) 47
第4章 C語言中的流程控制
判斷 48
4.1 代碼的運(yùn)行順序 48
4.2 判斷、選擇結(jié)構(gòu) 48
4.2.1 關(guān)鍵詞 48
4.2.2 流程圖 49
4.2.3 if 的單獨(dú)使用 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)的標(biāo)準(zhǔn)語法 61
5.3 switch 基礎(chǔ)示例 61
5.4 break 的用法 62
5.5 default 的用法 65
5.6 綜合代碼示例 67
5.6.1 成績等級劃分 67
5.6.2 簡易計(jì)算器 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 標(biāo)準(zhǔn)語法 75
6.2.2 while 的流程圖 75
6.2.3 while 的基本使用示例 76
6.3 do…while 循環(huán) 78
6.3.1 do…while 標(biāo)準(zhǔn)語法 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)標(biāo)準(zhǔ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標(biāo)準(zhǔn)輸入輸出頭
文件 167
10.2 time.h 時(shí)間和日期函數(shù)頭
文件 171
10.3 stdlib.h 標(biāo)準(zhǔn)庫函數(shù)頭文件 173
10.4 string.h 字符串函數(shù)頭文件 174
10.5 math.h 數(shù)學(xué)函數(shù)頭文件 177
10.6 本章小結(jié) 181
第11章 C語言中的指針 182
11.1 指針簡介 182
11.2 指針的聲明 183
11.2.1 指針相關(guān)的運(yù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 指針的高級應(yīng)用 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 枚舉的應(yīng)用場景 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語言中的預(yù)
處理 270
15.1 預(yù)處理簡介 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 預(yù)處理編譯 284
15.5 條件編譯 285
15.6 本章小結(jié) 287
第16章 綜合示例 289
16.1 MVC 設(shè)計(jì)模式 289
16.2 項(xiàng)目需求 291
16.3 項(xiàng)目源碼實(shí)現(xiàn) 291
16.3.1 項(xiàng)目文件結(jié)構(gòu) 291
16.3.2 源代碼時(shí)間及解析 292
16.4 本章小結(jié) 302