C語言學習指南:從規範編程到專業級開發
內容描述
本書將C語言中的知識由淺入深地安排成五個部分進行講解,通過大量簡明易懂的範例來演示C語言中的概念。
1部分介紹與C語言的語法及程序結構有關的基礎概念。
2部分介紹C語言的數據類型。
3部分講解如何用各種方式分配及釋放內存。
4部分介紹與讀取數據(輸入數據)及寫入數據(輸出數據)有關的各種話題。
5部分詳細解釋如何創建並管理含有多份文件的程序項目。
目錄大綱
譯者序
前言
作者簡介
審校者簡介
一部分C語言的基礎知識
1章運行Hello, World!程序2
1.1 技術要求2
1.2 編寫一個C語言程序3
1.3 了解程序開發流程4
1.3.1 編輯5
1.3.2 編譯6
1.3.3 運行9
1.3.4 驗證10
1.3.5 重複10
1.4 創建、錄入並保存一個C語言程序12
1.5 編譯一個C語言程序13
1.6 運行一個C語言程序14
1.7 添加註釋14
1.7.1 怎樣寫好註釋15
1.7.2 給Hello, world!程序添加註釋17
1.8 學著在代碼上做實驗18
1.9 小結19
2章了解程序的結構21
2.1 技術要求21
2.2 語句與代碼塊22
2.2.1 在語句與代碼塊中試驗各種轉義序列23
2.2.2 了解分隔符的用法25
2.2.3 了解空白的用法27
2.2.4 了解C語言的各種語句30
2.3 了解C語言的函數32
2.4 了解如何定義函數32
2.4.1 了解函數的標識符33
2.4.2 了解函數的語句塊35
2.4.3 了解函數的返回值35
2.4.4 通過函數的參數傳遞數值37
2.5 執行順序42
2.6 了解如何聲明函數43
2.7 小結46
3章基本的數據類型47
3.1 技術要求47
3.2 了解數據類型48
3.3 字節與數據塊51
3.4 如何在C語言代碼中表示整數52
3.4.1 如何在C語言代碼中表示正整數與負整數53
3.4.2 如何在C語言代碼中採用大小不同的數據塊來表示整數53
3.5 如何在C語言中表示小數55
3.6 如何在C語言中表示單個字符55
3.7 如何在C語言中表示布爾值56
3.8 如何在C語言中查詢各種數據類型的大小57
3.8.1 sizeof()運算符57
3.8.2 各種數據類型的取值範圍59
3.9 小結60
4章使用變量並為變量賦值61
4.1 技術要求62
4.2 選用合適的類型來表示數據值62
4.3 學習變量的用法62
4.3.1 給變量命名63
4.3.2 顯式地指定變量類型64
4.3.3 顯式地指定變量類型並初始化65
4.4 學習常量的用法66
4.4.1 字面常量66
4.4.2 用預處理指令定義常量值68
4.4.3 顯式地定義某種類型的常量69
4.4.4 給常量命名69
4.5 把類型適當的值賦給變量70
4.5.1 通過賦值語句顯式地賦值71
4.5.2 通過給函數傳遞參數來賦值71
4.5.3 通過return語句來賦值73
4.6 小結74
5章運算符與表達式75
5.1 技術要求76
5.2 表達式與運算符76
5.3 在數字值上執行運算78
5.4 類型轉換83
5.4.1 隱式類型轉換83
5.4.2 顯式類型轉換87
5.5 字符型數據支持的作88
5.6 邏輯運算符與關係運算符89
5.7 位運算符92
5.8 條件運算符94
5.9 序列運算符95
5.10 複合賦值運算符96
5.11 在一條表達式中給多個變量賦值97
5.12 增量運算符97
5.13 運算符之間的優先次序以及括號的用法99
5.14 小結100
6章用條件語句控製程序流102
6.1 技術要求103
6.2 了解各種條件表達式103
6.3 if() ... else ...語句104
6.4 switch() ...語句107
6.5 多個if() ... else ...語句111
6.6 嵌套的if() ... else ...語句114
6.7 小結117
7章循環與迭代119
7.1 技術要求119
7.2 重複執行代碼120
7.3 蠻力法實現重複執行代碼122
7.4 while () ...循環語句124
7.5 for() ...循環語句127
7.6 do ... while()循環語句129
7.7 如何把一種循環改寫成另一種循環131
7.8 善用goto語句以實現無條件跳轉132
7.9 用break與continue語句來控制循環136
7.10 無限循環139
7.11 小結140
8章創建並使用枚舉值141
8.1 技術要求141
8.2 枚舉值142
8.2.1 定義枚舉類型與枚舉值143
8.2.2 使用枚舉值145
8.3 用switch()...語句判斷枚舉變量的取值148
8.4 小結152
二部分複雜的數據類型
9章創建並使用結構體154
9.1 技術要求155
9.2 結構體155
9.2.1 聲明結構體156
9.2.2 初始化結構體並訪問其中的字段160
9.3 用函數作結構體161
9.4 包含其他結構體的結構體163
9.4.1 用函數初始化結構體165
9.4.2 復用某個函數以打印大結構體中的多個小結構體166
9.5 從結構體入手理解面向對象編程169
9.6 小結170
10章用typedef創建自定義數據類型171
10.1 技術要求171
10.2 用typedef給固有類型起別名172
10.3 用typedef簡化枚舉類型的用法174
10.4 用typedef簡化結構體類型的用法176
10.5 typedef的其他用法179
10.6 幾個有用的編譯器選項179
10.7 把自定義類型及typedef說明符放在頭文件中180
10.8 小結183
11章數組185
11.1 技術要求185
11.2 聲明並初始化數組186
11.3 訪問數組中的元素189
11.4 通過循環來作數組192
11.5 使用函數來作數組193
11.6 小結196
12章多維數組198
12.1 技術要求198
12.2 從一維數組到多維數組199
12.2.1 重新審視一維數組199
12.2.2 由一維數組來理解二維數組200
12.2.3 由二維數組來理解三維數組201
12.2.4 理解N維數組203
12.3 聲明並初始化多維數組203
12.3.1 聲明二維數組204
12.3.2 初始化二維數組204
12.3.3 聲明三維數組204
12.3.4 初始化三維數組205
12.3.5 聲明並初始化N維數組205
12.4 訪問多維數組中的元素206
12.5 用多層循環作多維數組207
12.5.1 用二層的嵌套循環遍歷二維數組208
12.5.2 用三層的嵌套循環遍曆三維數組208
12.6 在函數中使用多維數組209
12.7 小結212
13章指針213
13.1 技術要求214
13.2 C語言中的難點:指針214
13.3 指針的基礎知識215
13.3.1 直接尋址與間接尋址216
13.3.2 內存與內存尋址216
13.3.3 管理並訪問內存217
13.3.4 用現實示例來類比指針218
13.4 指針型變量的聲明、命名及賦值220
13.4.1 聲明指針型變量220
13.4.2 命名指針型變量221
13.4.3 給指針賦值(讓指針指向某個地址)222
13.5 與指針有關的作222
13.5.1 給指針賦值222
13.5.2 NULL指針與void*指針223
13.5.3 訪問指針的目標225
13.5.4 指針算術228
13.5.5 比較指針228
13.6 表述指針的作230
13.7 可變函數參數231
13.7.1 按引用傳遞233
13.7.2 直接把地址傳給函數,而不通過指針變量235
13.7.3 指向指針的指針236
13.8 指向結構體的指針238
13.8.1 通過指針訪問結構體及其字段239
13.8.2 在函數中使用指向結構體的指針239
13.9 小結241
14章數組與指針242
14.1 技術要求242
14.2 數組名稱與指針之間的關係242
14.3 數組元素與指針之間的關係245
14.4 通過指針作數組246
14.4.1 在指針上執行算術運算246
14.4.2 對指針使用自增運算符247
14.4.3 將數組作為重新訪問的函數指針傳遞250
14.4.4 數組名稱與指向該數組的指針有時可以互換251
14.5 指向數組的指針數組253
14.6 小結259
15章字符串260
15.1 技術要求261
15.2 字符串的基本單元:字符261
15.2.1 char類型與ASCII字符集262
15.2.2 比ASCII更大的字符集:UTF-8及Unicode265
15.2.3 字符支持的作266
15.2.4 判斷字符是否具備某項特徵268
15.2.5 作字符270
15.3 C語言字符串275
15.3.1 帶有終結符的字符數組275
15.3.2 C語言字符串的優點276
15.3.3 C語言字符串的缺點276
15.4 聲明並初始化字符串277
15.4.1 聲明字符串277
15.4.2 初始化字符串278
15.4.3 把字符串傳給函數280
15.4.4 空白字符串與空字符串281
15.4.5 重新審視Hello, World!程序282
15.5 創建並使用字符串數組283
15.6 用標準庫中的函數執行常見的字符串作288
15.6.1 常用的字符串函數288
15.6.2 更安全的字符串函數289
15.7 小結291
16章創建並使用複雜的結構體293
16.1 技術要求294
16.2 為什麼需要復雜的結構體294
16.3 重新審視card4.c295
16.4 理解結構體數組302
16.4.1 創建結構體數組302
16.4.2 訪問數組中的結構體元素303
16.4.3 作結構體數組305
16.5 包含小結構體的大結構體310
16.5.1 創建包含小結構體的大結構體310
16.5.2 訪問大結構體中的小結構體所具備的字段311
16.5.3 作包含小結構體的大結構體312
16.6 使用含有數組的結構體319
16.6.1 了解隨機與隨機數生成器319
16.6.2 創建含有數組的結構體320
16.6.3 訪問結構體所含數組中的元素321
16.6.4 作結構體所含數組中的元素321
16.7 使用含有結構體數組的大結構體324
16.7.1 創建包含結構體數組的大結構體325
16.7.2 訪問大結構體中的結構體數組內的各個小結構體325
16.7.3 作包含結構體數組的大結構體326
16.7.4 寫出終版的carddeck.c文件327
16.8 小結333
三部分內存分配
17章理解內存分配與生命期336
17.1 技術要求336
17.2 定義C語言中的各種存儲類337
17.3 固定存儲類(主要是其中的自動存儲類)與動態存儲類337
17.3.1 固定存儲類(主要是其中的自動存儲類)338
17.3.2 動態存儲類338
17.4 內部存儲類與外部存儲類338
17.4.1 內部(或局部)存儲類339
17.4.2 外部(或全局)存儲類340
17.4.3 自動變量(即存儲類為auto的變量)所具備的生命期341
17.5 理解靜態變量(即存儲類為static的變量)341
17.5.1 函數內的靜態變量341
17.5.2 函數外的靜態變量343
17.5.3 靜態變量的生命期344
17.6 小結344
18章動態內存分配345
18.1 技術要求345
18.2 了解動態內存346
18.3 分配並釋放動態內存347
18.3.1 分配動態內存348
18.3.2 釋放動態內存349
18.3.3 訪問動態內存350
18.3.4 動態內存的生命期350
18.4 與動態內存分配有關的注意事項351
18.5 一種動態的數據結構:鍊錶354
18.5.1 定義鍊錶所需的各種結構體354
18.5.2 聲明鍊錶支持的作355
18.5.3 更複雜的鍊錶作364
18.5.4 編寫測試程序以驗證鍊錶實現得是否正確365
18.6 其他動態數據結構369
18.7 小結370
部分輸入與輸出
19章學習各種輸出格式372
19.1 技術要求373
19.2 重新審視printf()函數373
19.3 用格式說明符調整無符號整數的格式375
19.3.1 在各種進制下解讀無符號整數375
19.3.2 把負數當成無符號整數來顯示376
19.3.3 用各種進製表示2與9的整數次方377
19.3.4 打印指針的值377
19.4 用格式說明符調整帶符號整數的格式379
19.4.1 使用字段寬度、精度、對齊方式與填充方式來顯示帶符號整數379
19.4.2 針對長長整數指定格式說明符380
19.4.3 用各種修飾符調整2與9的整數次方的顯示效果380
19.5 用格式說明符調整浮點數的格式381
19.5.1 使用字段寬度、精度、對齊方式與填充方式來顯示浮點數382
19.5.2 用十六進制顯示浮點數383
19.5.3 用合適的字段寬度顯示浮點數383
19.6 用格式說明符調整字符串與字符的格式385
19.6.1 使用字段寬度、精度、對齊方式與填充方式來顯示字符串385
19.6.2 輸出子字符串386
19.6.3 調整單個字符的輸出格式386
19.7 小結387
20章從命令行界面獲取輸入信息388
20.1 技術要求388
20.2 重新審視main()函數388
20.2.1 main()函數的特別之處389
20.2.2 main()函數的兩種形式389
20.3 使用argc與argv參數390
20.3.1 演示argc與argv的簡單用法390
20.3.2 命令行選項與命令行處理器392
20.4 小結395
21章調整輸入值的格式397
21.1 技術要求398
21.2 流簡介398
21.2.1 理解標準輸出流400
21.2.2 理解標準輸入流402
21.2.3 通過printf()與fprintf()重新審視控制台輸出402
21.2.4 通過scanf()函數探索控制台輸入403
21.3 用scanf()函數讀取格式化的輸入數據404
21.3.1 用scanf()函數讀取用戶輸入的數字值404
21.3.2 用scanf()函數讀取用戶輸入的字符串與字符408
21.3.3 用scan set限定用戶輸入的字符411
21.3.4 控制scanf()處理輸入數據時所用的字段寬度413
21.4 通過字符串緩衝區轉換數據416
21.4.1 通過sprintf()與sscanf()在值與字符串之間轉換417
21.4.2 用atoi()與atod()將字符串轉換成數字418
21.5 無格式的輸入與輸出419
21.5.1 從控制台輸入字符串或把字符串輸出到控制台419
21.5.2 通過gets()函數獲取簡單的輸入字符串並通過puts()函數顯示簡單的輸出字符串420
21.5.3 用fgets()與fputs()獲取一系列名稱並輸出排序後的名單421
21.6 小結425
22章文件427
22.1 技術要求428
22.2 文件的基本概念428
22.2.1 重新審視文件流428
22.2.2 FILE流的各項屬性429
22.2.3 開啟和關閉文件430
22.2.4 了解每種數據流所支持的文件作431
22.3 文件系統的基礎知識432
22.4 打開文件以讀取數據或寫入數據434
22.4.1 在程序中獲取用戶輸入的文件名436
22.4.2 獲取用戶通過命令行參數傳入的文件名438
22.5 小結439
23章文件輸入和文件輸出440
23.1 技術要求440
23.2 處理文件441
23.3 創建一個未排序名稱的文件446
23.3.1 從fgets()獲取到的輸入字符串中移除首尾的空白字符447
23.3.2 讀取名稱和寫入名稱448
23.4 讀取未排序的人名並輸出排序後的名單452
23.4.1 用鍊錶給人名排序454
23.4.2 將排序後的名單寫入輸出端458
作者介紹
Jeff Szuhay
是QuarterTil2的首席開發人員,專門針對桌面環境開髮帶有豐富圖形效果的軟件計時碼表。
他在計算機軟件開發領域有超過35年的經驗,全程參與過各種開發工作的初期編程、
完整測試以及最終交付等環節,這些工作包括系統分析、系統性能優化以及應用程序設計等。
他於1988年在匹茲堡大學獲得計算機科學學士學位。
多年來他致力於使用C語言和類C語言進行編程,他精通C++、Objective-C、C#和JavaScript。