關于我們
書單推薦
新書推薦
|
零基礎學C語言(第4版)
本書分為“C語言基礎”“一窺C語言門徑”“C語言進階”“C語言程序設計實例與面試題解析”四篇,系統(tǒng)全面地介紹了C語言各個方面的知識,從*簡單的“Hello World”程序?qū)懫,逐步深化、細化,第壹篇。書中對每個知識和技術要點都給出了翔實的示例及代碼分析。和其他書籍中羅列代碼的做法不同,本書中的代碼力求短小精悍,直擊要點,避免了細枝末節(jié)對讀者思維的干擾。在講解知識點的同時輔以筆者多年的C語言編程經(jīng)驗解析,可加深讀者的理解。
前言
第一篇 C語言基礎 第1章 踏上征程前的思想動員1 1.1 為什么選擇C語言1 1.2 如何學好C語言3 1.3 語言概述3 1.3.1 什么是語言3 1.3.2 什么是機器語言3 1.3.3 什么是匯編語言4 1.3.4 面向過程的語言5 1.3.5 什么是C語言5 1.4 程序的開發(fā)周期5 1.4.1 編輯C源代碼6 1.4.2 編譯C源代碼6 1.4.3 連接目標文件7 1.4.4 編譯連接過程示例7 1.4.5 運行程序9 1.5 C、C++、VC++的區(qū)別和開發(fā)環(huán)境9 1.6 小結11 1.7 習題11 第2章 跟我寫Hello World13 2.1 了解需求才能創(chuàng)建程序13 2.2 認識Code::Blocks開發(fā)環(huán)境13 2.2.1 為什么選擇Code::Blocks14 2.2.2 啟動Code::Blocks14 2.2.3 新建Hello World項目14 2.2.4 定義新項目15 2.2.5 添加源代碼到項目16 2.2.6 調(diào)試器設置16 2.2.7 開始編輯代碼17 2.3 編譯運行18 2.4 調(diào)試排錯(debug)19 2.4.1 debug的由來19 2.4.2 設置斷點20 2.4.3 調(diào)試運行20 2.5 第一個程序容易出現(xiàn)的錯誤21 2.5.1 包含命令include21 2.5.2 關鍵字main22 2.5.3 表示代碼行結束的分號22 2.6 小結22 2.7 習題22 第3章 分解Hello World——最簡單C程序的組成24 3.1 C程序的構成24 3.2 C程序的注釋25 3.3 C程序必須有的main函數(shù)26 3.4 調(diào)用函數(shù)在屏幕上顯示文字27 3.5 #include預處理器指示符28 3.5.1 函數(shù)聲明及其作用28 3.5.2 試驗尋找#include的作用29 3.5.3 #include的作用30 3.6 計算1+1的程序?qū)嵗?1 3.7 數(shù)據(jù)從哪里來,又到哪里去——變量32 3.7.1 變量在內(nèi)存中的表現(xiàn)形式32 3.7.2 編譯器使用變量符號表32 3.7.3 變量及其使用33 3.8 自己設計C函數(shù)35 3.8.1 在main函數(shù)中計算3個整數(shù)的平均數(shù)35 3.8.2 在main函數(shù)中分3次計算3個整數(shù)的平均數(shù)36 3.8.3 自編函數(shù)實現(xiàn)計算3個整數(shù)的平均數(shù)36 3.8.4 如何自編寫函數(shù)37 3.8.5 觀察總結函數(shù)聲明和函數(shù)定義的意義38 3.9 語句構成程序39 3.10 優(yōu)秀程序員的代碼風格40 3.11 小結40 3.12 習題41 第4章 常量、變量及數(shù)據(jù)類型42 4.1 計算機是如何表示數(shù)據(jù)的42 4.1.1 二進制、八進制、十六進制42 4.1.2 表示數(shù)據(jù)的字節(jié)和位44 4.1.3 內(nèi)存是存儲數(shù)據(jù)的房間45 4.2 數(shù)據(jù)類型46 4.2.1 整數(shù)類型46 4.2.2 整數(shù)的有符號和無符號48 4.2.3 實數(shù)類型50 4.2.4 字符類型50 4.2.5 數(shù)據(jù)類型總結51 4.3 常量51 4.3.1 直接常量和符號常量52 4.3.2 符號常量的優(yōu)點53 4.3.3 直接常量的書寫格式54 4.3.4 轉(zhuǎn)義字符55 4.3.5 字符串57 4.4 變量58 4.4.1 變量的聲明58 4.4.2 變量聲明的意義59 4.4.3 標識符和關鍵字60 4.4.4 變量在內(nèi)存中占據(jù)的空間和變量的值62 4.4.5 為變量賦初值64 4.4.6 變量使用時常見的錯誤65 4.5 幾個與變量相關的經(jīng)典算法66 4.5.1 累加和累乘66 4.5.2 交換兩個變量的值68 4.6 小結69 4.7 習題69 第5章 用屏幕和鍵盤交互——簡單的輸出和輸入71 5.1 輸入—處理—輸出:這就是程序71 5.2 向屏幕輸出——printf()函數(shù)詳解72 5.2.1 printf()函數(shù)的一般形式72 5.2.2 printf()函數(shù)的輸出原理73 5.2.3 格式控制字符串的一般形式74 5.2.4 輸出帶符號的整數(shù)%d75 5.2.5 設置最小寬度的輸出75 5.2.6 長整型輸出%ld76 5.2.7 輸出八進制形式76 5.2.8 輸出十六進制的形式77 5.2.9 輸出十進制的unsigned型數(shù)據(jù)77 5.2.10 輸出字符78 5.2.11 輸出字符串%s79 5.2.12 輸出實型數(shù)據(jù)%f81 5.2.13 輸出指數(shù)形式的實數(shù)82 5.2.14 自動選擇%f或者%e形式輸出%g83 5.2.15 printf()函數(shù)的幾點說明83 5.3 字符輸出putchar()和字符串輸出puts()84 5.3.1 字符輸出函數(shù)84 5.3.2 字符串輸出函數(shù)85 5.4 接收鍵盤輸入——scanf()函數(shù)詳解86 5.4.1 scanf()函數(shù)的一般形式86 5.4.2 scanf()函數(shù)的輸入原理87 5.4.3 多數(shù)據(jù)輸入分隔規(guī)則89 5.4.4 控制輸入的格式字符90 5.4.5 scanf()函數(shù)的使用說明91 5.4.6 使用scanf()函數(shù)的注意事項93 5.5 字符輸入函數(shù)getchar()95 5.6 輸入和輸出程序舉例96 5.7 小結98 5.8 習題99 第6章 程序的基本構成——運算符和表達式100 6.1 認識C中的運算符和表達式100 6.1.1 運算符和表達式100 6.1.2 操作數(shù)、運算符和表達式101 6.1.3 C運算符簡介102 6.2 算術運算符和算術表達式102 6.2.1 基本的算術運算符103 6.2.2 ++自增、--自減運算符104 6.2.3 算術表達式和運算符的優(yōu)先級及結合性106 6.3 逗號運算符和逗號表達式107 6.3.1 逗號表達式的一般形式107 6.3.2 逗號表達式的優(yōu)先級和結合性108 6.4 關系運算符和關系表達式109 6.4.1 關系運算符的種類109 6.4.2 關系表達式的一般形式109 6.5 邏輯運算符和邏輯表達式110 6.5.1 邏輯運算符111 6.5.2 邏輯真值表111 6.6 賦值運算符和賦值表達式112 6.6.1 賦值表達式112 6.6.2 復合運算符113 6.7 強制類型轉(zhuǎn)換和自動類型轉(zhuǎn)換113 6.7.1 強制類型轉(zhuǎn)換113 6.7.2 自動類型轉(zhuǎn)換115 6.8 運算符的優(yōu)先級116 6.8.1 優(yōu)先級、結合性匯總116 6.8.2 sizeof運算117 6.9 取地址運算符117 6.10 小結118 6.11 習題118 第7章 程序的最小獨立單元——語句120 7.1 5種語句類型120 7.1.1 表達式語句120 7.1.2 函數(shù)調(diào)用語句122 7.1.3 空語句122 7.1.4 復合語句(塊語句)122 7.1.5 流程控制語句123 7.2 結構化程序設計123 7.2.1 什么是算法123 7.2.2 算法的表示123 7.2.3 算法的偽代碼表示124 7.2.4 算法的流程圖表示124 7.2.5 3種控制結構124 7.2.6 算法示例125 7.3 小結125 7.4 習題126 第8章 條件判斷——分支結構127 8.1 if語句127 8.1.1 判斷表達式127 8.1.2 花括號和if結構體128 8.2 if...else結構129 8.2.1 關鍵在else129 8.2.2 if...else結構體130 8.3 多分支語句和分支語句嵌套131 8.3.1 多分支131 8.3.2 多分支if結構133 8.3.3 分支語句嵌套134 8.4 switch結構135 8.4.1 一般形式135 8.4.2 為什么叫開關語句137 8.4.3 default語句138 8.4.4 if結構和switch結構之比較139 8.4.5 switch結構的常見錯誤與解決方法139 8.5 小結140 8.6 習題141 第9章 一遍又一遍——循環(huán)結構142 9.1 構造循環(huán)142 9.1.1 循環(huán)的條件142 9.1.2 當型循環(huán)和直到型循環(huán)143 9.2 while和do...while循環(huán)結構143 9.2.1 語法規(guī)則144 9.2.2 代碼塊145 9.2.3 while語句的常見錯誤145 9.2.4 do...while語句的常見錯誤146 9.3 for循環(huán)結構147 9.3.1 基本形式147 9.3.2 表達式省略149 9.3.3 循環(huán)終止和步長150 9.3.4 for語句的常見錯誤150 9.4 循環(huán)嵌套151 9.4.1 嵌套示例151 9.4.2 嵌套的效率152 9.4.3 循環(huán)嵌套程序的常見錯誤153 9.5 與循環(huán)密切相關的流程轉(zhuǎn)向控制語句154 9.5.1 用break跳出循環(huán)154 9.5.2 用continue重來一次155 9.5.3 用goto實現(xiàn)跳轉(zhuǎn)156 9.6 小結157 9.7 習題157 第二篇 一窺C語言門徑 第10章 同一類型多個元素的集合——簡單數(shù)組159 10.1 什么是數(shù)組159 10.1.1 數(shù)組是一大片連續(xù)內(nèi)存空間159 10.1.2 數(shù)組元素的訪問160 10.2 一維數(shù)組160 10.2.1 一維數(shù)組的聲明160 10.2.2 一維數(shù)組元素的訪問161 10.2.3 一維數(shù)組的初始化162 10.2.4 不合法的數(shù)組操作163 10.3 二維數(shù)組164 10.3.1 二維數(shù)組的聲明164 10.3.2 二維數(shù)組的初始化164 10.3.3 二維數(shù)組應用舉例165 10.4 更高維的數(shù)組166 10.4.1 高維數(shù)組的聲明和元素訪問166 10.4.2 初始化166 10.4.3 多維數(shù)組在內(nèi)存中是如何排列元素的167 10.5 小結168 10.6 習題168 第11章 寫程序就是寫函數(shù)——函數(shù)入門170 11.1 什么是函數(shù)170 11.1.1 函數(shù)的由來170 11.1.2 C語言中的函數(shù)170 11.2 自定義函數(shù)171 11.2.1 函數(shù)定義語法171 11.2.2 函數(shù)定義范例172 11.2.3 不要重復定義173 11.3 函數(shù)調(diào)用與返回173 11.3.1 形參和實參174 11.3.2 傳址調(diào)用175 11.3.3 函數(shù)返回176 11.4 告訴編譯器有這么一個函數(shù)177 11.4.1 函數(shù)聲明的語法177 11.4.2 聲明不同于定義179 11.4.3 標準庫函數(shù)的聲明180 11.5 函數(shù)的調(diào)用過程180 11.6 小結180 11.7 習題180 第12章 C語言難點——指針初探182 12.1 計算機中的內(nèi)存182 12.1.1 內(nèi)存地址182 12.1.2 內(nèi)存中保存的內(nèi)容183 12.1.3 地址就是指針183 12.2 指針的定義183 12.2.1 指針變量的聲明183 12.2.2 指針變量的初始化184 12.2.3 指針變量的值185 12.2.4 取地址操作符&185 12.2.5 指針變量占據(jù)一定的內(nèi)存空間185 12.2.6 指向指針的指針186 12.2.7 指針變量常見的錯誤分析與解決186 12.3 使用指針187 12.3.1 運算符*188 12.3.2 指針的類型和指針所指向的類型189 12.3.3 同類型指針的賦值189 12.3.4 void指針190 12.3.5 指針的類型和指針所指向的類型不同190 12.4 指針的運算192 12.4.1 算術運算之“指針+整數(shù)”或“指針-整數(shù)”192 12.4.2 指針-指針193 12.4.3 指針的大小比較194 12.5 指針表達式與左值194 12.5.1 指針與整型194 12.5.2 指針與左值195 12.5.3 指針與const195 12.6 動態(tài)內(nèi)存分配196 12.6.1 動態(tài)分配的好處196 12.6.2 malloc與free函數(shù)197 12.6.3 calloc與free198 12.6.4 free函數(shù)與指針199 12.6.5 內(nèi)存泄漏199 12.6.6 釋放已經(jīng)釋放了的內(nèi)存會出問題200 12.7 小結200 12.8 習題200 第13章 字符串及字符串操作202 13.1 C風格字符串202 13.1.1 C風格字符串的聲明202 13.1.2 C風格字符串在內(nèi)存中的表示202 13.2 字符數(shù)組的輸入輸出203 13.2.1 字符數(shù)組的聲明203 13.2.2 字符數(shù)組可以進行整體輸入輸出204 13.2.3 使用gets()函數(shù)讀取整行205 13.2.4 訪問字符數(shù)組中某個元素205 13.2.5 使用puts()函數(shù)實現(xiàn)字符串的輸出206 13.2.6 使用字符數(shù)組的常見問題206 13.3 字符串處理函數(shù)207 13.3.1 理解:數(shù)組名是常指針208 13.3.2 strlen()函數(shù)與size_t210 13.3.3 字符串復制函數(shù)strcpy()211 13.3.4 字符串比較函數(shù)strcmp()212 13.3.5 字符串連接函數(shù)strcat()213 13.3.6 全轉(zhuǎn)換為大寫形式213 13.3.7 鏈式操作214 13.4 小結214 13.5 習題215 第14章 結構體、共用體、枚舉和typedef216 14.1 結構體216 14.1.1 結構體的定義216 14.1.2 聲明結構體變量217 14.1.3 初始化結構變量218 14.1.4 訪問結構體成員218 14.1.5 結構體定義的位置219 14.1.6 結構體變量賦值219 14.2 特殊結構體220 14.2.1 結構體嵌套220 14.2.2 匿名結構體223 14.3 共用體224 14.3.1 什么是共用體224 14.3.2 共用體的定義224 14.3.3 聲明共用體變量225 14.3.4 共用體變量的初始化225 14.3.5 共用體成員訪問225 14.3.6 共用體賦值226 14.4 結構體和共用體的內(nèi)存差異226 14.4.1 結構體變量和共用體變量內(nèi)存形式的不同227 14.4.2 結構體變量的內(nèi)存大小227 14.4.3 字節(jié)對齊228 14.4.4 最寬基本類型228 14.4.5 共用體的大小229 14.5 枚舉類型230 14.5.1 什么是枚舉類型230 14.5.2 枚舉類型的定義230 14.5.3 聲明枚舉變量231 14.5.4 枚舉常量是什么231 14.5.5 使用枚舉時常見的錯誤232 14.6 給類型取個別名——typedef233 14.6.1 typedef基本用法233 14.6.2 #define用法233 14.7 小結234 14.8 習題234 第15章 如何節(jié)省內(nèi)存——位運算235 15.1 什么是位運算235 15.1.1 開燈關燈235 15.1.2 改變狀態(tài)235 15.1.3 計算機中的數(shù)據(jù)存儲形式236 15.2 位邏輯運算符237 15.2.1 位取反操作237 15.2.2 位與運算237 15.2.3 位或運算237 15.2.4 位異或238 15.2.5 實例分析238 15.3 移位運算239 15.3.1 基本形式239 15.3.2 移位舉例239 15.3.3 移位和乘以2241 15.4 小結241 15.5 習題241 第三篇 C語言進階主題 第16章 存儲不僅僅局限于內(nèi)存——文件243 16.1 什么是文件243 16.1.1 文件243 16.1.2 流244 16.1.3 重定向244 16.1.4 文件的處理形式——緩沖區(qū)和非緩沖區(qū)245 16.1.5 文件的存儲形式——文本形式和二進制形式245 16.2 C語言如何使用文件245 16.2.1 文件型指針245 16.2.2 文件操作的步驟246 16.3 文件的打開與關閉246 16.3.1 用于打開文件的fopen()函數(shù)247 16.3.2 打開是否成功248 16.3.3 用于關閉文件的fclose()函數(shù)249 16.4 文件的讀寫249 16.4.1 讀寫的相對參照249 16.4.2 如何判斷文件已經(jīng)結束249 16.4.3 字符讀寫函數(shù)fgetc()和fputc()250 16.4.4 字符串讀寫函數(shù)fgets()和fputs()251 16.4.5 塊讀寫函數(shù)fread()和fwrite()253 16.4.6 格式化文件輸入輸出fprintf()與fscanf()256 16.5 文件的定位258 16.5.1 移動指針到文件開頭rewind()258 16.5.2 移動指針到當前位置ftell()258 16.5.3 移動指針fseek()258 16.6 小結260 16.7 習題260 第17章 靈活卻難以理解——指針進階262 17.1 指針與數(shù)組262 17.1.1 數(shù)組名指針262 17.1.2 使用數(shù)組名常指針表示數(shù)組元素263 17.1.3 指向數(shù)組元素的指針變量263 17.1.4 指向數(shù)組的指針變量264 17.1.5 指針數(shù)組265 17.1.6 指針與數(shù)組的常見問題266 17.2 指針、結構體和結構體數(shù)組266 17.2.1 兩種訪問形式266 17.2.2 聲明創(chuàng)建一個結構體數(shù)組267 17.2.3 結構體數(shù)組的初始化267 17.2.4 結構體數(shù)組的使用268 17.2.5 指向結構體數(shù)組的指針268 17.3 函數(shù)指針269 17.3.1 函數(shù)名指針269 17.3.2 指向函數(shù)的指針270 17.3.3 函數(shù)指針類型272 17.3.4 函數(shù)指針作函數(shù)參數(shù)273 17.3.5 函數(shù)指針數(shù)組274 17.3.6 指向函數(shù)指針的指針275 17.4 小結275 17.5 習題276 第18章 更深入的理解——函數(shù)進階277 18.1 參數(shù)傳遞的副本機制277 18.1.1 傳值調(diào)用的副本277 18.1.2 傳址調(diào)用的副本機制278 18.2 函數(shù)返回值的副本機制281 18.2.1 return 局部變量為什么合法281 18.2.2 返回指針申請動態(tài)內(nèi)存282 18.2.3 不要返回指向棧內(nèi)存的指針282 18.2.4 返回指向只讀存儲區(qū)的指針283 18.3 函數(shù)與結構體283 18.3.1 結構體變量的傳值和傳址調(diào)用283 18.3.2 結構體變量的成員作為函數(shù)參數(shù)284 18.3.3 返回結構體的函數(shù)285 18.3.4 返回結構體指針的函數(shù)286 18.4 函數(shù)與數(shù)組286 18.4.1 數(shù)組元素作為函數(shù)參數(shù)286 18.4.2 數(shù)組名作為函數(shù)參數(shù)287 18.4.3 多維數(shù)組名作為函數(shù)參數(shù)289 18.4.4 數(shù)組名作函數(shù)參數(shù)時的退化290 18.5 遞歸290 18.5.1 遞歸流程290 18.5.2 遞歸兩要素292 18.5.3 效率VS可讀性293 18.6 帶參數(shù)的主函數(shù)294 18.7 小結295 18.8 習題295 第19章 生存期、作用域與可見域297 19.1 內(nèi)存分配297 19.1.1 內(nèi)存分區(qū)297 19.1.2 變量的存儲類別298 19.1.3 生存期299 19.1.4 作用域與可見域299 19.2 auto變量299 19.2.1 定義格式300 19.2.2 作用域和生存期300 19.2.3 auto變量的屏蔽準則301 19.2.4 重復定義302 19.2.5 auto變量的初始化和特點302 19.3 register變量303 19.3.1 定義格式303 19.3.2 使用舉例303 19.4 extern變量304 19.4.1 全局變量定義304 19.4.2 全局變量聲明305 19.4.3 可見域306 19.4.4 全局變量的屏蔽準則307 19.4.5 全局變量的利與弊309 19.5 static變量309 19.5.1 定義格式309 19.5.2 靜態(tài)局部變量310 19.5.3 靜態(tài)全局變量311 19.5.4 靜態(tài)局部變量和靜態(tài)全局變量的區(qū)別312 19.5.5 extern變量和static變量的初始化312 19.6 函數(shù)的作用域與可見域312 19.6.1 內(nèi)部函數(shù)313 19.6.2 外部函數(shù)314 19.7 結構體定義的作用域與可見域314 19.7.1 定義位置與可見域314 19.7.2 允許重復定義315 19.8 常見的有關變量存儲的錯誤316 19.9 小結318 19.10 習題318 第20章 編譯及預處理320 20.1 編譯流程320 20.1.1 編輯321 20.1.2 預處理321 20.1.3 編譯321 20.1.4 連接322 20.2 程序錯誤322 20.2.1 錯誤分類323 20.2.2 編譯錯誤323 20.2.3 連接錯誤323 20.2.4 邏輯錯誤323 20.2.5 排錯324 20.3 預處理命令之宏定義324 20.3.1 宏定義324 20.3.2 不帶參數(shù)的宏定義324 20.3.3 帶參數(shù)的宏定義326 20.3.4 #define定義常量與const常量328 20.3.5 文件包含329 20.3.6 條件編譯330 20.3.7 宏函數(shù)331 20.4 小結332 20.5 習題333 第21章 數(shù)據(jù)結構334 21.1 鏈表334 21.1.1 鏈表的結構334 21.1.2 創(chuàng)建鏈表并遍歷輸出335 21.1.3 鏈表的插入338 21.1.4 鏈表結點的刪除341 21.1.5 鏈表的逆置342 21.1.6 鏈表的銷毀344 21.1.7 鏈表的綜合實例344 21.1.8 循環(huán)鏈表349 21.1.9 雙鏈表349 21.2 棧和隊列352 21.2.1 棧的定義353 21.2.2 棧的分類353 21.2.3 棧的操作353 21.2.4 函數(shù)與棧356 21.2.5 隊列356 21.3 自定義類型359 21.4 小結361 21.5 習題362 第四篇 C語言程序設計實例與面試題解析 第22章 面試題解析363 22.1 基礎知識363 22.1.1 指針自增自減有什么不同363 22.1.2 什么是遞歸364 22.1.3 宏定義與操作符的區(qū)別364 22.1.4 引用與值傳遞的區(qū)別364 22.1.5 指針和引用有什么區(qū)別364 22.1.6 什么是棧364 22.1.7 main函數(shù)執(zhí)行前還會執(zhí)行什么代碼364 22.1.8 static有什么用途365 22.1.9 定義int **a[3][4], 則變量占用的內(nèi)存空間為多少365 22.1.10 什么是預編譯365 22.1.11 int (*s[10])(int)表示什么意義365 22.1.12 結構體與共同體有何區(qū)別365 22.2 算法和思維邏輯知識366 22.2.1 100美元哪里去了366 22.2.2 將16升水平均分給四個人366 22.2.3 算出小王買了幾瓶啤酒、幾瓶飲料367 22.2.4 找出不同的蘋果367 22.2.5 找出不同的球368 22.2.6 猜自己的帽子顏色368 22.2.7 3筐水果各是什么370 22.2.8 最后剩下的是誰370 22.2.9 聰明的商人371 22.2.10 紅球和白球371 22.2.11 烏龜賽跑372 22.2.12 投硬幣372 附錄 ASCII編碼表373
你還可能感興趣
我要評論
|