商品簡介
作者簡介
名人/編輯推薦
目次
商品簡介
本書以C語言中的重難點“指標”為主題,提供了程序員所需的深入而完整的指針知識。作者結合多年的程序設計經驗和感悟,從C指針的概念講起,通過實驗一步一步地揭示了指標和陣列、內存、資料結構的關係,展現了指針的常見用法,揭示了各種使用技巧,還通過獨特的方式告訴讀者怎樣解讀C語言那些讓人“糾結”的聲明語法,以及如何繞過C指標的陷阱等。第2版基於64位元作業系統對內容進行了大幅修訂,新增了對ISO-C99、C11標準下相關內容的介紹等。
本書非常適合C語言中級學習者閱讀,也可作為計算機專業學生學習C語言的參考。
本書非常適合C語言中級學習者閱讀,也可作為計算機專業學生學習C語言的參考。
作者簡介
前橋和彌(作者)
1969年出生,著有《自製程序設計語言》《徹底掌握C語言》《Java之謎和陷阱》等,其一針見血的“毒舌”文風和對程序設計語言深刻的見地受到廣大讀者的歡迎。
朱文佳(譯者)
2005年畢業於上海大學計算機科學與技術學院,在對日通信行業從事開發及管理十餘年,具有豐富的嵌入式C語言開發及項目管理經驗。愛好閱讀,自學日語,願盡自己綿薄之力為大家分享優秀的外國圖書。
1969年出生,著有《自製程序設計語言》《徹底掌握C語言》《Java之謎和陷阱》等,其一針見血的“毒舌”文風和對程序設計語言深刻的見地受到廣大讀者的歡迎。
朱文佳(譯者)
2005年畢業於上海大學計算機科學與技術學院,在對日通信行業從事開發及管理十餘年,具有豐富的嵌入式C語言開發及項目管理經驗。愛好閱讀,自學日語,願盡自己綿薄之力為大家分享優秀的外國圖書。
名人/編輯推薦
日本“毒舌”程序員透徹講解指標、陣列和聲明!
原版長銷20年,累計印刷20次!
1.暢銷書全面升級
新版基於64位元作業系統大幅修訂,新增對C99、C11標準內容的介紹。
2.直擊學習難點,為你講透C指針的真正用法
作者言辭犀利,觀點鮮明,擅長將複雜的知識淺顯易懂地講清楚,其以“毒舌”的文風為讀者揭示了指標的各種使用技巧,能夠讓讀者在輕鬆愉快的氛圍中迅速領悟要領。
3.一線程序員二十餘年經驗沉澱,常讀常新
作者結合多年程序設計經驗與感悟,從指針的概念講起,通過實驗一步一步地解釋了指標與陣列、內存、資料結構的關係等,教會讀者如何解讀C語言“奇葩”的聲明語法、如何繞過C指針的陷阱等,每次閱讀都能有新的收穫。
4.配套代碼資源可下載。
原版長銷20年,累計印刷20次!
1.暢銷書全面升級
新版基於64位元作業系統大幅修訂,新增對C99、C11標準內容的介紹。
2.直擊學習難點,為你講透C指針的真正用法
作者言辭犀利,觀點鮮明,擅長將複雜的知識淺顯易懂地講清楚,其以“毒舌”的文風為讀者揭示了指標的各種使用技巧,能夠讓讀者在輕鬆愉快的氛圍中迅速領悟要領。
3.一線程序員二十餘年經驗沉澱,常讀常新
作者結合多年程序設計經驗與感悟,從指針的概念講起,通過實驗一步一步地解釋了指標與陣列、內存、資料結構的關係等,教會讀者如何解讀C語言“奇葩”的聲明語法、如何繞過C指針的陷阱等,每次閱讀都能有新的收穫。
4.配套代碼資源可下載。
目次
第0章
本書目標與讀者物件 1
0-1 本書目標 2
0-2 讀者物件與內容結構 5
第 1章
打好基礎——預備知識和複習 9
1-1 C語言是什麼樣的語言 10
1-1-1 C語言的發展歷程 10
是組合語言還是彙編器 11
B語言是什麼樣的語言 12
1-1-2 不完備和不統一的語法 13
1-1-3 C語言“聖經”——K&R 13
1-1-4 ANSI C之前的C語言 14
1-1-5 ANSI C(C89/90) 16
1-1-6 C95 16
1-1-7 C99 17
1-1-8 C11 18
1-1-9 C語言的理念 19
1-1-10 C語言的主體 20
1-1-11 C語言曾是只能使用標量的語言 21
1-2 內存和位址 23
1-2-1 內存和位址 23
1-2-2 內存和變數 25
size_t類型 27
1-2-3 內存和程式運行 27
1-3 關於指標 29
1-3-1 惡名昭著的指針究竟是什麼 29
1-3-2 和指針的第 一次親密接觸 30
1-3-3 地址運算子、間接運算子、下標運算子 34
關於本書中的地址值——16進制標記法 35
混亂的聲明——如何自然地理解聲明 35
雜談:hoge是什麼 37
1-3-4 指針和位址之間的微妙關係 38
在運行時既沒有類型信息,也沒有變數名 40
1-3-5 指針運算 41
1-3-6 何謂空指針 42
NULL和0和\0 43
1-3-7 實踐——從函數返回多個值 46
形參與實參 50
1-4 關於陣列 51
1-4-1 使用陣列 51
C語言的陣列是從0開始的 53
1-4-2 陣列與指標的微妙關係 54
1-4-3 下標運算子[]與陣列毫無關係 56
語法糖 59
1-4-4 為何存在指針運算這種奇怪功能 59
1-4-5 別再濫用指針運算了 61
更改參數的做法可取嗎 62
1-4-6 試圖將陣列作為函數參數傳遞 63
如果對陣列進行值傳遞 65
1-4-7 聲明函數形參的方法 66
C語言為什麼不進行陣列邊界檢查 67
1-4-8 C99中的可變長陣列 68
第 2章
做個實驗——C語言是怎樣使用內存的 71
2-1 虛擬位址 72
關於scanf() 75
未定義、未指定、實現定義 77
2-2 C語言中內存的使用方法 78
2-2-1 C語言中變數的種類 78
2-2-2 嘗試輸出位址 80
存儲類說明符 80
2-3 函數與字串字面量 85
2-3-1 唯讀內存區域 85
2-3-2 指向函數的指標 86
2-4 靜態變數 88
2-4-1 什麼是靜態變數 88
2-4-2 分割編譯與連結 88
2-5 自動變數(棧) 91
2-5-1 內存空間的“重複使用” 91
2-5-2 函式呼叫究竟發生了什麼 91
調用約定 95
2-5-3 自動變數的引用 95
一旦函數執行結束,自動變數的內存空間就會被釋放 98
2-5-4 典型的安全性漏洞——緩衝區溢位漏洞 99
作業系統針對緩衝區溢位漏洞給出的對策 102
2-5-5 可變長參數 103
assert() 106
試寫一個用於調試的函數 107
2-5-6 遞迴呼叫 110
2-5-7 C99中的可變長陣列(VLA)的棧 113
2-6 利用malloc()動態分配內存(堆) 116
2-6-1 malloc()的基礎知識 116
應該強制轉換malloc()的返回數值型別嗎 119
2-6-2 malloc()是系統調用嗎 119
2-6-3 malloc()中發生了什麼 120
2-6-4 free()之後相應的內存空間會怎樣 122
Valgrind 124
2-6-5 碎片化 124
2-6-6 malloc()以外的動態內存分配函數 125
假如malloc()參數為0 127
malloc()的返回值檢查 128
程式結束時也必須調用free()嗎 129
2-7 對齊 131
結構體的成員名稱在運行時也是缺失的 134
2-8 位元組序 135
2-9 關於語言規範和實現——抱歉,前面的內容都是騙你的 137
第3章
語法揭秘——它到底是怎麼回事 139
3-1 解讀C語言聲明 140
3-1-1 用英語閱讀 140
3-1-2 解讀C語言聲明 141
近來的語言多數是將類型後置的 144
3-1-3 類型名 145
如果把間接運算子*後置 146
3-2 C語言資料類型的模型 147
3-2-1 基本類型和派生類型 147
3-2-2 指針類型的派生 148
3-2-3 陣列類型的派生 150
3-2-4 什麼是指向陣列的指標 150
3-2-5 C語言中不存在多維陣列 152
3-2-6 函數類型的派生 154
3-2-7 計算類型的長度 155
3-2-8 基本類型 157
3-2-9 結構體和聯合體 159
3-2-10 不完全類型 159
3-3 運算式 162
3-3-1 運算式和資料類型 162
對“運算式”使用sizeof 164
3-3-2 什麼是左值——變數的兩張面孔 166
“左值”的由來 167
3-3-3 陣列→指標的轉換 168
3-3-4 與陣列和指標相關的運算子 169
3-3-5 多維陣列 171
運算子的優先順序 173
3-4 解讀C語言聲明(續) 176
3-4-1 const修飾符 176
3-4-2 如何使用const?可以用到哪種程度 178
const可以代替#define嗎 181
3-4-3 typedef 181
3-5 其他 185
3-5-1 函數形參的聲明(ANSI C版) 185
K&R中關於函數形參聲明的說明 186
3-5-2 函數形參的聲明(C99版) 188
3-5-3 關於空的下標運算子[] 189
定義與聲明 191
3-5-4 字串字面量 192
字串字面量是char的陣列 194
3-5-5 關於指向函數的指標引發的混亂 195
3-5-6 強制類型轉換 196
3-5-7 練習——解讀複雜聲明 198
3-6 請記住:陣列與指標截然不同 203
3-6-1 你為什麼感到混亂 203
3-6-2 在運算式中 204
3-6-3 在聲明中 206
第4章
陣列和指標的常見用法 209
4-1 基本用法 210
4-1-1 通過返回值以外的方法返回 210
4-1-2 將陣列作為函數的參數傳遞 211
4-1-3 動態陣列——通過malloc()分配的可變長陣列 212
其他語言的陣列 214
4-2 組合使用 216
4-2-1 動態陣列的陣列 216
寬字元 223
4-2-2 動態陣列的動態陣列 225
4-2-3 命令列參數 228
4-2-4 通過參數返回指針 230
什麼是“雙指針” 235
4-2-5 將多維陣列作為函數的參數傳遞 236
4-2-6 將多維陣列作為函數的參數傳遞(VLA版) 237
4-2-7 通過malloc()分配縱橫可變的二維陣列(C99) 239
C語言中的多維陣列是行優先的 240
縱橫可變的二維陣列的ANSI C實現 241
Java和C#的多維陣列 242
4-2-8 陣列的動態陣列 243
4-2-9 在考慮可變之前,不妨考慮使用結構體 244
4-2-10 可變長結構體(ANSI C版) 246
關於分配可變長結構體時的長度指定 248
4-2-11 柔性陣列成員(C99) 248
指標可以指向陣列的最後一個元素的下一個元素 249
第5章
資料結構——指標的真正用法 251
5-1 案例學習1:計算單詞的使用頻率 252
5-1-1 案例的需求 252
各種語言中指標的叫法 253
引用傳遞 253
5-1-2 設計 256
關於標頭檔的寫法 259
5-1-3 陣列版 261
5-1-4 鏈表版 265
標頭檔的公有和私有 271
當需要同時處理多個資料時 272
反覆運算器 273
5-1-5 添加查找功能 275
翻倍遊戲 277
5-1-6 其他資料結構 277
5-2 案例學習2:繪圖工具的資料結構 283
5-2-1 案例的需求 283
5-2-2 表示各種圖形 284
關於坐標系 285
5-2-3 Shape類型 286
5-2-4 討論——還有其他方法嗎 289
能保存任何類型的鏈表 293
5-2-5 圖形的組合 294
5-2-6 通過指向函數的指標的陣列分配處理 300
5-2-7 通往繼承與多態之路 302
將draw()放入Shape中真的好嗎 302
5-2-8 指針的可怕之處 304
5-2-9 那麼,指針到底是什麼呢 305
第6章
其他——拾遺 307
6-1 新的函數組 308
6-1-1 添加了範圍檢查的函數(C11) 308
restrict關鍵字 310
6-1-2 無須使用靜態存儲空間的函數(C11) 311
6-2 陷阱 314
6-2-1 整數提升 314
6-2-2 如果在(老式的)C語言中使用float類型的參數 316
6-2-3 printf()與scanf() 318
6-2-4 原型聲明的光與影 319
6-3 慣用寫法 321
6-3-1 結構體聲明 321
6-3-2 自引用結構體 322
6-3-3 結構體的相互引用 323
6-3-4 結構體的嵌套 324
6-3-5 聯合體 325
6-3-6 無名結構體和無名聯合體(C11) 326
6-3-7 陣列的初始化 327
6-3-8 指向char的指標的陣列的初始化 328
6-3-9 結構體的初始化 329
6-3-10 聯合體的初始化 330
6-3-11 指定初始化(C99) 331
6-3-12 複合字面量(C99) 332
參考文獻 334
本書目標與讀者物件 1
0-1 本書目標 2
0-2 讀者物件與內容結構 5
第 1章
打好基礎——預備知識和複習 9
1-1 C語言是什麼樣的語言 10
1-1-1 C語言的發展歷程 10
是組合語言還是彙編器 11
B語言是什麼樣的語言 12
1-1-2 不完備和不統一的語法 13
1-1-3 C語言“聖經”——K&R 13
1-1-4 ANSI C之前的C語言 14
1-1-5 ANSI C(C89/90) 16
1-1-6 C95 16
1-1-7 C99 17
1-1-8 C11 18
1-1-9 C語言的理念 19
1-1-10 C語言的主體 20
1-1-11 C語言曾是只能使用標量的語言 21
1-2 內存和位址 23
1-2-1 內存和位址 23
1-2-2 內存和變數 25
size_t類型 27
1-2-3 內存和程式運行 27
1-3 關於指標 29
1-3-1 惡名昭著的指針究竟是什麼 29
1-3-2 和指針的第 一次親密接觸 30
1-3-3 地址運算子、間接運算子、下標運算子 34
關於本書中的地址值——16進制標記法 35
混亂的聲明——如何自然地理解聲明 35
雜談:hoge是什麼 37
1-3-4 指針和位址之間的微妙關係 38
在運行時既沒有類型信息,也沒有變數名 40
1-3-5 指針運算 41
1-3-6 何謂空指針 42
NULL和0和\0 43
1-3-7 實踐——從函數返回多個值 46
形參與實參 50
1-4 關於陣列 51
1-4-1 使用陣列 51
C語言的陣列是從0開始的 53
1-4-2 陣列與指標的微妙關係 54
1-4-3 下標運算子[]與陣列毫無關係 56
語法糖 59
1-4-4 為何存在指針運算這種奇怪功能 59
1-4-5 別再濫用指針運算了 61
更改參數的做法可取嗎 62
1-4-6 試圖將陣列作為函數參數傳遞 63
如果對陣列進行值傳遞 65
1-4-7 聲明函數形參的方法 66
C語言為什麼不進行陣列邊界檢查 67
1-4-8 C99中的可變長陣列 68
第 2章
做個實驗——C語言是怎樣使用內存的 71
2-1 虛擬位址 72
關於scanf() 75
未定義、未指定、實現定義 77
2-2 C語言中內存的使用方法 78
2-2-1 C語言中變數的種類 78
2-2-2 嘗試輸出位址 80
存儲類說明符 80
2-3 函數與字串字面量 85
2-3-1 唯讀內存區域 85
2-3-2 指向函數的指標 86
2-4 靜態變數 88
2-4-1 什麼是靜態變數 88
2-4-2 分割編譯與連結 88
2-5 自動變數(棧) 91
2-5-1 內存空間的“重複使用” 91
2-5-2 函式呼叫究竟發生了什麼 91
調用約定 95
2-5-3 自動變數的引用 95
一旦函數執行結束,自動變數的內存空間就會被釋放 98
2-5-4 典型的安全性漏洞——緩衝區溢位漏洞 99
作業系統針對緩衝區溢位漏洞給出的對策 102
2-5-5 可變長參數 103
assert() 106
試寫一個用於調試的函數 107
2-5-6 遞迴呼叫 110
2-5-7 C99中的可變長陣列(VLA)的棧 113
2-6 利用malloc()動態分配內存(堆) 116
2-6-1 malloc()的基礎知識 116
應該強制轉換malloc()的返回數值型別嗎 119
2-6-2 malloc()是系統調用嗎 119
2-6-3 malloc()中發生了什麼 120
2-6-4 free()之後相應的內存空間會怎樣 122
Valgrind 124
2-6-5 碎片化 124
2-6-6 malloc()以外的動態內存分配函數 125
假如malloc()參數為0 127
malloc()的返回值檢查 128
程式結束時也必須調用free()嗎 129
2-7 對齊 131
結構體的成員名稱在運行時也是缺失的 134
2-8 位元組序 135
2-9 關於語言規範和實現——抱歉,前面的內容都是騙你的 137
第3章
語法揭秘——它到底是怎麼回事 139
3-1 解讀C語言聲明 140
3-1-1 用英語閱讀 140
3-1-2 解讀C語言聲明 141
近來的語言多數是將類型後置的 144
3-1-3 類型名 145
如果把間接運算子*後置 146
3-2 C語言資料類型的模型 147
3-2-1 基本類型和派生類型 147
3-2-2 指針類型的派生 148
3-2-3 陣列類型的派生 150
3-2-4 什麼是指向陣列的指標 150
3-2-5 C語言中不存在多維陣列 152
3-2-6 函數類型的派生 154
3-2-7 計算類型的長度 155
3-2-8 基本類型 157
3-2-9 結構體和聯合體 159
3-2-10 不完全類型 159
3-3 運算式 162
3-3-1 運算式和資料類型 162
對“運算式”使用sizeof 164
3-3-2 什麼是左值——變數的兩張面孔 166
“左值”的由來 167
3-3-3 陣列→指標的轉換 168
3-3-4 與陣列和指標相關的運算子 169
3-3-5 多維陣列 171
運算子的優先順序 173
3-4 解讀C語言聲明(續) 176
3-4-1 const修飾符 176
3-4-2 如何使用const?可以用到哪種程度 178
const可以代替#define嗎 181
3-4-3 typedef 181
3-5 其他 185
3-5-1 函數形參的聲明(ANSI C版) 185
K&R中關於函數形參聲明的說明 186
3-5-2 函數形參的聲明(C99版) 188
3-5-3 關於空的下標運算子[] 189
定義與聲明 191
3-5-4 字串字面量 192
字串字面量是char的陣列 194
3-5-5 關於指向函數的指標引發的混亂 195
3-5-6 強制類型轉換 196
3-5-7 練習——解讀複雜聲明 198
3-6 請記住:陣列與指標截然不同 203
3-6-1 你為什麼感到混亂 203
3-6-2 在運算式中 204
3-6-3 在聲明中 206
第4章
陣列和指標的常見用法 209
4-1 基本用法 210
4-1-1 通過返回值以外的方法返回 210
4-1-2 將陣列作為函數的參數傳遞 211
4-1-3 動態陣列——通過malloc()分配的可變長陣列 212
其他語言的陣列 214
4-2 組合使用 216
4-2-1 動態陣列的陣列 216
寬字元 223
4-2-2 動態陣列的動態陣列 225
4-2-3 命令列參數 228
4-2-4 通過參數返回指針 230
什麼是“雙指針” 235
4-2-5 將多維陣列作為函數的參數傳遞 236
4-2-6 將多維陣列作為函數的參數傳遞(VLA版) 237
4-2-7 通過malloc()分配縱橫可變的二維陣列(C99) 239
C語言中的多維陣列是行優先的 240
縱橫可變的二維陣列的ANSI C實現 241
Java和C#的多維陣列 242
4-2-8 陣列的動態陣列 243
4-2-9 在考慮可變之前,不妨考慮使用結構體 244
4-2-10 可變長結構體(ANSI C版) 246
關於分配可變長結構體時的長度指定 248
4-2-11 柔性陣列成員(C99) 248
指標可以指向陣列的最後一個元素的下一個元素 249
第5章
資料結構——指標的真正用法 251
5-1 案例學習1:計算單詞的使用頻率 252
5-1-1 案例的需求 252
各種語言中指標的叫法 253
引用傳遞 253
5-1-2 設計 256
關於標頭檔的寫法 259
5-1-3 陣列版 261
5-1-4 鏈表版 265
標頭檔的公有和私有 271
當需要同時處理多個資料時 272
反覆運算器 273
5-1-5 添加查找功能 275
翻倍遊戲 277
5-1-6 其他資料結構 277
5-2 案例學習2:繪圖工具的資料結構 283
5-2-1 案例的需求 283
5-2-2 表示各種圖形 284
關於坐標系 285
5-2-3 Shape類型 286
5-2-4 討論——還有其他方法嗎 289
能保存任何類型的鏈表 293
5-2-5 圖形的組合 294
5-2-6 通過指向函數的指標的陣列分配處理 300
5-2-7 通往繼承與多態之路 302
將draw()放入Shape中真的好嗎 302
5-2-8 指針的可怕之處 304
5-2-9 那麼,指針到底是什麼呢 305
第6章
其他——拾遺 307
6-1 新的函數組 308
6-1-1 添加了範圍檢查的函數(C11) 308
restrict關鍵字 310
6-1-2 無須使用靜態存儲空間的函數(C11) 311
6-2 陷阱 314
6-2-1 整數提升 314
6-2-2 如果在(老式的)C語言中使用float類型的參數 316
6-2-3 printf()與scanf() 318
6-2-4 原型聲明的光與影 319
6-3 慣用寫法 321
6-3-1 結構體聲明 321
6-3-2 自引用結構體 322
6-3-3 結構體的相互引用 323
6-3-4 結構體的嵌套 324
6-3-5 聯合體 325
6-3-6 無名結構體和無名聯合體(C11) 326
6-3-7 陣列的初始化 327
6-3-8 指向char的指標的陣列的初始化 328
6-3-9 結構體的初始化 329
6-3-10 聯合體的初始化 330
6-3-11 指定初始化(C99) 331
6-3-12 複合字面量(C99) 332
參考文獻 334
主題書展
更多
主題書展
更多書展購物須知
大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。
特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。
無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。
為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。
若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。

