本書圍繞C語言編程學習和開發(fā)實踐中經常遇到的問題和重點,結合大量代碼和圖表,從容易出現的錯誤(ERROR)開始講起,到類型轉換、字符串和指針、結構體和共用體、文件處理、在程序運行時動態(tài)生成必要大小的對象(變量)的方法,再到線性表的應用、二叉查找樹的應用、控制臺畫面的控制等,詳細介紹了C語言中的眾多技巧,目標在于提高讀者解決實際問題的能力。本書適合有一定C語言基礎的讀者閱讀。
一本熱銷十余年的編程系列圖書
日本編程大師柴田望洋的匠心之作
豐富的圖表,通俗的示例,有趣的知識,實用的技巧,從理論到實踐,一本教你攻克C語言難關的必讀教程
204段代碼+174幅圖表 | 比課本更易懂!
原版系列累計銷量超120萬冊
榮獲日本工學教育協(xié)會著作獎
雙色印刷|技術書也能賞心悅目
作者柴田望洋,1963年出生,日本復崗工業(yè)大學信息工程學院副教授。編寫了一系列極富影響力的計算機教材和參考書,如《明解C++》《明解Java》等。
目 錄
第 1章 看不見的錯誤輸入 1
1-1 看不見的錯誤 2
看不見的錯誤 2
難以察覺的錯誤 3
容易忽略的錯誤 5
預處理指令中的空白字符 7
#if 指令和注釋 7
頭文件保護符 9
函數式宏及其運行效率 10
函數式宏的副作用 10
C++ 中max2的實現 12
1-2 初始化 15
初始化和賦值 15
對象 16
自動存儲期 16
靜態(tài)存儲期 18
標識符的有效范圍和初始化 20
數組的初始化 22
多維數組的初始化 24
使用 typedef名的數組的初始化 26
第 2章 類型轉換 29
2-1 類型轉換 30
-1和1哪個大? 30
if 語句的求值 31
關系運算符和關系式 31
相等運算符和等式 32
if 語句的控制表達式 35
隱式類型轉換 37
普通算術類型轉換 38
2-2 有符號整數和無符號整數 39
無符號整數在內存中的表示 39
有符號整數在內存中的表示 41
整型提升 43
有符號整數和無符號整數之間的類型轉換 45
問題的解決 47
補碼表示的有符號整數到無符號整數的類型轉換 48
第 3章 關于指針 53
3-1 指針和地址 54
地址和取址運算符 54
指針和間接運算符 55
3-2 指針和函數調用 58
值傳遞 58
傳遞指針給函數 59
傳遞指針的指針給函數 61
3-3 指針和數組 64
數組的傳遞 64
表示數組末尾的哨兵 67
指針、數組和數據類型 69
3-4 指針和多維數組 72
數據類型的派生和多維數組 72
多維數組和指針 76
3-5 動態(tài)對象的生成 80
動態(tài)存儲期 80
void 指針 81
單個對象的生成 81
數組對象的生成 83
多維數組對象的生成 85
第 4章 字符串和指針 89
4-1 字符和字符串 90
字符和字符串 90
字符和字符常量 90
字符的值 91
字符串 93
字符串字面量 95
字符串字面量和字符串常量 97
用指針實現的字符串的操作 99
指向字符串的指針 100
字符串數組 101
4-2 字符串的處理 103
字符串的復制 103
字符串不能為空? 106
使字符串為空的兩種方法 108
使字符串為空的錯誤方法 110
問題的解決 111
存儲空間的清空 113
字符串的動態(tài)生成 115
字符串數組的動態(tài)生成 117
第 5章 NULL 119
5-1 空指令、空字符和空語句 120
null 120
空指令 120
空字符 121
空字符串 121
空語句 122
5-2 空指針和NULL 124
空指針 124
空指針常量 124
返回空指針的函數 124
空指針在內存中的表示不一定為 0 125
第 6章 函數的定義和聲明 129
6-1 函數的定義和調用 130
函數定義的順序 130
調用未聲明的函數 131
默認的 int型 132
未聲明的函數的處理 133
老式風格的函數聲明 135
老式風格的函數聲明的陷阱 136
6-2 函數原型聲明 137
函數原型聲明 137
默認參數提升 138
參數名 142
可變參數的聲明 143
va_start 宏:訪問可變參數前的準備 145
va_arg 宏:取出可變參數 146
va_end 宏:結束對可變參數的訪問 147
vprintf 函數/vfprintf函數:輸出到流 147
第 7章 結構體和共用體 151
7-1 結構體 152
結構體的基礎 152
成員的訪問 153
結構體對象的初始化 153
結構體和宏 154
結構體和 typedef聲明 155
相互引用的結構體 157
7-2 結構體與字節(jié)對齊 162
代碼優(yōu)化 162
結構體和字節(jié)對齊 163
offsetof 宏 165
7-3 共用體 168
共用體 168
共用體對象的初始化 168
公共初始序列 169
第 8章 文件處理和文本文件 173
8-1 文本文件 174
文件和流 174
文件的打開和關閉 175
FILE 型 177
輸入輸出庫函數 178
問題和解決方法 184
解決方法一:添加無效數據 185
解決方法二:優(yōu)化程序 186
8-2 作為字符的數據 189
數值的讀取 189
數值和字符串 190
使用 sprintf 函數將數據寫入字符串 196
使用 sscanf 函數從字符串中讀取數據 197
第 9章 文件的應用 201
9-1 流和緩沖區(qū) 202
調用的函數未被執(zhí)行? 202
緩沖區(qū)的刷新 203
流的緩沖區(qū) 205
問題的解決 207
9-2 文本文件和二進制文件 209
文本和二進制 209
文件的轉儲 210
二進制文件的訪問 212
字節(jié)序 214
換行符的處理 214
第 10章 棧溢出 217
10-1 !218
棧的實現 218
10-2 棧溢出 224
函數調用和!224
數據和!225
棧溢出 227
檢測棧溢出的原理 229
如果棧被破壞 230
第 11章 庫開發(fā)的基礎 231
11-1 源文件的分離和鏈接 232
單字符輸入輸出庫 232
隊列 234
庫的使用示例 235
分離式編譯 236
鏈接性 237
11-2 庫開發(fā) 240
源文件的分離 240
正確的示例 243
第 12章 線性表的應用 249
12-1 線性表 250
線性表 250
節(jié)點的實現 250
線性表的特點 251
線性表的實現 252
線性表存儲空間的動態(tài)分配 256
12-2 用數組實現的線性表 258
用數組實現的線性表 258
刪除的記錄的管理 261
12-3 帶索引的線性表 264
帶索引的線性表 264
索引表 270
第 13章 二叉查找樹的應用 273
13-1 二叉查找樹 274
二叉查找樹 274
二叉查找樹和線性表 278
13-2 非遞歸查找及其應用 282
遞歸的過程 282
遞歸函數的非遞歸實現 283
問題的解決 285
第 14章 控制臺的操作 291
14-1 轉義序列 292
轉義序列 292
14-2 畫面控制庫 296
Windows API 的使用 296
clearscreen 實用程序 299
setcolor 實用程序 299
猜數游戲 301
致 謝 304
作者簡介 305