征服 C指針, 2/e
[日]前橋和彌
買這商品的人也買了...
-
$690$538 -
$450$405 -
$480$408 -
$539$512 -
$354$336 -
$500$390 -
$300Qt 5.9 C++ 開發指南
-
$653C語言非常道
-
$680$537 -
$990$782 -
$177計算方法, 3/e
-
$380$296 -
$414$393 -
$709奔跑吧 Linux 內核 (捲1):基礎架構, 2/e
-
$270C/C++ 代碼調試的藝術
-
$1,000$850 -
$658奔跑吧 Linux 內核入門篇, 2/e
-
$602嵌入式 C語言自我修養 — 從芯片、編譯器到操作系統
-
$714$678 -
$880$695 -
$1,000$790 -
$779$740 -
$662二進制分析實戰
-
$894$849 -
$588$559
相關主題
商品描述
本書以C語言中的重難點“指針”為主題,提供了程序員所需的深入而完整的指針知識。作者結合多年的編程經驗和感悟,從C指針的概念講起,通過實驗一步一步地揭示了指針和數組、內存、數據結構的關系,展現了指針的常見用法,揭示了各種使用技巧,還通過獨特的方式告訴讀者怎樣解讀C語言那些讓人“糾結”的聲明語法,以及如何繞過C指針的陷阱等。第2版基於64位操作系統對內容進行了大幅修訂,新增了對ISO-C99、C11標準下相關內容的介紹等。
本書非常適合C語言中級學習者閱讀,也可作為電腦專業學生學習C語言的參考。
作者簡介
前橋和彌(作者)
1969年出生,著有《自製編程語言》《徹底掌握C語言》《Java之謎和陷阱》等,其一針見血的“毒舌”文風和對編程語言深刻的見地受到廣大讀者的歡迎。
朱文佳(譯者)
2005年畢業於上海大學計算機科學與技術學院,在對日通信行業從事開發及管理十餘年,具有豐富的嵌入式C語言開發及項目管理經驗。
愛好閱讀,自學日語,願儘自己綿薄之力為大家分享優秀的外國圖書。
目錄大綱
第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