宣傳語
百科全書式的C語言編程寶典,值得每個程式設計師珍藏
囊括C語言從基礎知識到高級開發技術的全景式解讀
內 容 提 要
毋庸置疑,C語言從產生到現在的各個階段,都是最重要和最流行的程式語言之一。熟悉和掌握C語言程式設計,已經成為程式設計師的一門必修課。本書言簡意賅、通俗易懂,知識點覆蓋全面,詳細介紹了C語言的程式設計及最新的C語言編程技術。
本書分4篇,共29章,分別介紹了C語言基礎、C語言進階、C語言的接口技術和現代C語言的擴展。首先,介紹了C語言及其開發環境,並全面介紹了C語言的基本語法知識;接著,詳細講解了C語言的一些高級程式套用;然後,介紹了C語言與其他主流程式語言的接口;最後,講解了現代C語言的一些擴展套用和高級技術。
本書結構安排緊湊、講解詳細、實例豐富。C語言程式設計的初學者通過本書可以快速掌握C語言程式設計方法。同時,本書對現代C語言程式的接口和高級技術進行了全面講解,對具有一定開發經驗的設計人員也有非常好的參考價值。本書可以作為C語言初學者的入門教材,也可作為C語言程式設計師的參考手冊,還可作為大中專院校學生及電腦培訓班的參考書。
前 言
C語言從產生到現在經歷了幾十年的發展,一直經久不衰,已成為最重要和最流行的程式語言之一。目前雖然產生了許多新的程式語言,例如C++、Java、C51等,但這些語言都是借鑑C語言而發展起來的。因此,C語言是每一個計算機技術人員的基本功之一。
C語言具有高級語言的強大功能,卻又有很多直接操作計算機硬體的功能(這些都是彙編語言的功能),因此C語言通常又被稱為中級語言。學習和掌握C語言,既可以增進對於計算機底層工作機制的了解,又為進一步學習其他高級語言打下了堅實的基礎。同時,隨著時代的發展,C語言也有了很大的發展,例如嵌入式領域的套用、並行計算、和其他語言接口等。
和其他書籍相比,本書有如下優點
(1)本書不僅詳細介紹了C語言程式設計的基礎知識,還對常用的高級編程技術進行了詳細的講解。
(2)本書在講解每個知識點的同時,均給出了其在程式設計中的套用實例,每個實例都可以通過編譯執行,使得讀者可以快速掌握對應知識點如何在程式設計中套用。
(3)本書不僅全面介紹了C語言的程式設計方法,還詳細講解了C語言如何與最新流行的程式語言進行接口,這是C語言的最新發展。
(4)針對C語言的最新發展,本書還介紹了其在嵌入式、單片機及並行計算方面的套用。這些發展使得C語言保持了經久不衰的活力。
(5)本書對每一個實例的程式代碼都進行了詳細的注釋和分析,並給出了運行結果,使得讀者更加容易理解。
(6)本書採用套用最為廣泛的編譯環境,並且適用於多種作業系統。讀者既可在Windows環境下、又可在Linux環境下使用本書學習C語言。
目 錄
第1篇 C語言基礎篇
第1章 C語言概述 2
C語言是現代套用最為廣泛的程式語言,深受廣大程式設計師的喜愛。本章將簡要介紹C語言的產生髮展、C語言的特點、標準及C語言流程等內容。並通過一個完整的例子演示C程式開發過程中的項目創建、原始碼編寫、編譯及調試的全過程。同時,將分析C語言程式構成特點。
1.1 C語言發展歷史 2
1.2 C語言的特點 3
1.2.1 C語言的基本特點 3
1.2.2 C語言的優點 4
1.2.3 C語言的缺點 5
1.3 C語言的標準 5
1.3.1 C標準概述 5
1.3.2 C語言的新標準 6
1.3.3 編譯器對C標準的支持 10
1.4 C語言開發流程 11
1.4.1 功能分析 11
1.4.2 劃分任務 11
1.4.3 編寫原始碼 12
1.4.4 編譯和連結 12
1.4.5 修改原始碼 13
1.4.6 功能測試 13
1.4.7 發布程式 13
1.4.8 維護和修改 13
1.5 第一個C程式 13
1.5.1 創建項目 14
1.5.2 輸入原始碼 15
1.5.3 編譯連結 16
1.5.4 調試 16
1.6 C程式構成分析 17
1.6.1 頭檔案 17
1.6.2 主函式 17
1.6.3 其他組成部分 18
1.7 良好的編程規範 21
1.7.1 完備和詳盡的程式注釋 21
1.7.2 整齊的代碼書寫格式 21
1.7.3 簡潔清晰的命名 22
1.8 C語言在不同領域的擴展套用 22
1.8.1 單片機方面 22
1.8.2 LabVIEW方面 22
1.8.3 LabWindows/CVI方面 23
1.8.4 MATLAB方面 23
1.8.5 JavaScript方面 23
1.8.6 並行計算方面 24
1.8.7 Linux平台 24
1.9 小結 24
第2章 典型的C語言開發環境 25
C語言的成功及大範圍的套用也造就了豐富的C語言編譯器。對於用戶來說,學習C語言要緊密結合C編譯器或者C集成開發環境來進行。程式設計師要想快速高效地開發C程式,必須首先熟悉C語言開發環境的使用。本章將介紹幾種主流的C語言開發環境。
2.1 C語言開發環境簡介 25
2.1.1 C語言開發環境的構成 25
2.1.2 典型的C語言開發環境 26
2.2 使用Turbo C開發 30
2.2.1 Turbo C的開發環境簡介 30
2.2.2 Turbo C的配置檔案 31
2.2.3 用Turbo C創建C程式 31
2.2.4 編譯連結程式 32
2.2.5 運行程式 33
2.3 使用Visual Studio開發 34
2.3.1 Microsoft Visual C++的開發環境簡介 34
2.3.2 使用Visual Studio 2008創建C程式 35
2.3.3 編譯連結程式 38
2.3.4 調試運行程式 38
2.4 使用Dev-C++開發 38
2.4.1 Dev-C++的開發環境簡介 39
2.4.2 Dev-C++開發環境的設定 39
2.4.3 使用Dev-C++創建C程式 41
2.4.4 編譯和運行程式 41
2.4.5 升級Dev-C++ 42
2.5 使用Code::Blocks開發 42
2.5.1 Code::Blocks的開發環境簡介 42
2.5.2 Code::Blocks開發環境的設定 43
2.5.3 使用Code::Blocks創建C程式 45
2.5.4 編譯運行程式 46
2.6 小結 46
第3章 C語言數據類型 47
應用程式一般在計算機的記憶體中運行,對各種數據進行操作。C語言中的數據具有不同的類型,用於不同對象的表示。數據是C語言基本的操作對象。本章將首先介紹記憶體中程式和數據的存儲,然後將介紹C語言中各種數據類型及其特點。
3.1 數據的存儲 47
3.1.1 記憶體單元 47
3.1.2 數據的存儲 48
3.1.3 程式在記憶體中的映射 49
3.2 數據類型簡介 49
3.2.1 基本類型 49
3.2.2 構造類型 51
3.2.3 指針類型 51
3.2.4 空類型 51
3.3 標識符和關鍵字 51
3.3.1 標識符 52
3.3.2 關鍵字 52
3.4 分隔設定 53
3.4.1 單分隔設定 54
3.4.2 組合分隔設定 54
3.5 常量 54
3.5.1 直接常量 54
3.5.2 符號常量 55
3.6 變數 58
3.6.1 變數聲明 58
3.6.2 變數初始化 59
3.7 整型數據 60
3.7.1 整型數據的聲明 60
3.7.2 整型數據的存儲 61
3.7.3 整型常量 65
3.7.4 整型數據的輸入 66
3.7.5 整型數據的輸出 68
3.8 字元型數據 69
3.8.1 字元型變數的聲明 69
3.8.2 字元型的存儲 70
3.8.3 字元型常量 71
3.8.4 轉義字元 72
3.8.5 字元型數據的輸入 73
3.8.6 字元型數據的輸出 74
3.9 浮點型數據 75
3.9.1 浮點型數據的聲明 75
3.9.2 浮點型數據的存儲 76
3.9.3 浮點型常量 77
3.9.4 浮點型數據的輸入 78
3.9.5 浮點型數據的輸出 79
3.10 類型轉換 80
3.10.1 混合運算中的類型轉換 80
3.10.2 強制類型轉換 83
3.11 C99新增數據類型 84
3.12 小結 86
第4章 運算符和表達式 87
第3章介紹了C語言中的基本數據類型,這些是C語言最基本的操作對象。而在第4章中,讀者將了解到最基本的操作方法,即運算符和表達式。在C語言中,通過運算符將常量、變數等操作對象組成表達式,而後,由表達式進一步構成C語句。可以說,運算符和表達式是C語言中最基本的操作方法。
4.1 運算符 87
4.1.1 運算符概述 87
4.1.2 算術運算符 88
4.1.3 賦值運算符 90
4.1.4 關係運算符 92
4.1.5 邏輯運算符 93
4.1.6 條件運算符 94
4.1.7 位運算符 95
4.1.8 其他運算符 98
4.1.9 運算符優先權和結合性 102
4.2 表達式 104
4.2.1 算術表達式 104
4.2.2 賦值表達式 105
4.2.3 逗號表達式 106
4.2.4 關係和邏輯表達式 107
4.3 小結 109
第5章 C語句及流程控制結構 110
第4章介紹了C語言中的運算符和表達式,這些是構成C語句的基本單元。C語句,即C語言中的操作命令,用於使計算機完成特定的功能。一條完整的語句必須以“;”結束。C語言的源程式是由一系列的語句組成的,這些語句可以完成變數聲明、賦值和控制輸入/輸出等操作。由於計算機能識別的是機器指令,因此,編譯系統將一條語句轉換成若干條機器指令來執行。C語言中的語句包括說明語句、表達式語句、循環語句、條件語句、開關語句、複合語句、空語句和返回語句等,下面分別進行介紹。
5.1 說明語句 110
5.2 表達式語句 110
5.3 複合語句 111
5.4 循環語句 112
5.4.1 while循環語句 112
5.4.2 do…while循環語句 113
5.4.3 for循環語句 114
5.5 條件語句 116
5.5.1 單分支if條件結構 116
5.5.2 雙分支if條件結構 116
5.5.3 階梯式if…else…if條件結構 117
5.5.4 if條件結構總結 119
5.6 開關語句 120
5.7 跳轉語句 121
5.7.1 goto跳轉語句 121
5.7.2 break跳轉語句 122
5.7.3 continue跳轉語句 123
5.8 函式調用語句 124
5.9 空語句 125
5.10 返回語句 126
5.11 C語言的流程控制結構 127
5.12 小結 128
第6章 格式化輸入/輸出 129
使用電腦程式解決問題時,需要由用戶輸入數據,通過程式進行運算後,再輸出結果。由此過程可以看到,程式中輸入/輸出占有相當重要的地位。在C語言中,所有的數據輸入/輸出都是由庫函式完成的,因此都是函式語句。在前面各章的實例中,曾使用過printf()函式和scanf()函式進行數據的輸出和輸入。本章將詳細介紹這兩個函式的使用,同時,還將介紹其他一些用於輸入和輸出的函式。
6.1 格式化輸出函式printf() 129
6.1.1 printf()函式的格式 129
6.1.2 printf()函式的格式字元 130
6.1.3 printf()函式的修飾符 131
6.1.4 典型的printf()函式實例 134
6.1.5 動態設定輸出寬度和精度 138
6.1.6 printf()函式的返回值 139
6.1.7 理解輸出列表 140
6.1.8 printf格式化輸出函式綜合實例 142
6.2 格式化輸入函式scanf() 143
6.2.1 scanf()函式的格式 143
6.2.2 scanf()函式格式字元串 145
6.2.3 scanf()函式注意問題 146
6.2.4 scanf()函式的返回值 148
6.2.5 格式化輸入函式scanf()綜合實例 148
6.3 其他常用的輸入/輸出函式 149
6.3.1 字元讀入函式getchar() 149
6.3.2 字元讀入函式getch() 150
6.3.3 字元串讀入函式gets() 151
6.3.4 字元輸出函式putch() 152
6.3.5 字元輸出函式putchar() 153
6.3.6 字元串輸出函式puts() 153
6.3.7 格式化記憶體緩衝區輸出函式sprintf() 154
6.3.8 格式化記憶體緩衝區輸入函式sscanf() 155
6.4 小結 156
第7章 數組 157
在前面章節中介紹了C語言的基本數據類型,包括整型、字元型和實型。以這些基本數據類型為基礎,C語言還提供幾種構造數據類型。構造類型數據是由基本類型數據按一定規則組成的,數組就是其中一種構造數據類型。在程式中用循環結構可以很方便地處理數組。本章將詳細介紹C語言中數組的使用。
7.1 了解數組 157
7.1.1 使用數組的好處 157
7.1.2 數組的概念 158
7.1.3 數組的維數 160
7.2 一維數組 161
7.2.1 一維數組的聲明 161
7.2.2 一維數組的存儲 164
7.2.3 一維數組的引用 164
7.2.4 向函式傳遞一維數組 166
7.2.5 一維數組的初始化 166
7.3 二維數組 169
7.3.1 二維數組的聲明 169
7.3.2 二維數組的存儲 170
7.3.3 二維數組的引用 171
7.3.4 二維數組的初始化 173
7.4 字元數組和字元串 175
7.4.1 一維字元串數組 176
7.4.2 了解字元串 177
7.4.3 字元串的操作函式 178
7.4.4 字元串的輸入輸出 179
7.4.5 二維字元串數組 181
7.5 多維數組 182
7.6 數組的基本套用 182
7.6.1 反轉字元串 182
7.6.2 查找最大值 183
7.6.3 數據排序 185
7.7 小結 186
第8章 函式 187
使用C語言編程,就肯定會使用到函式。C語言允許用戶使用一些編譯環境自帶的庫函式,例如使用printf()函式輸出變數的值,使用scanf()函式接收用戶的輸入等。合理使用庫函式可以大大簡化程式設計過程。同時,為了有利於程式的模組化,促進程式資源的共享。C語言也支持用戶使用自定義函式。本章將詳細介紹函式的概念、調用、作用域等相關知識。
8.1 函式的概念 187
8.1.1 什麼是函式 187
8.1.2 函式的分類 188
8.1.3 函式的定義 189
8.1.4 main()函式 191
8.2 函式的工作過程 192
8.2.1 程式結構 192
8.2.2 函式執行過程 193
8.3 編寫函式 193
8.3.1 函式頭 193
8.3.2 返回類型 194
8.3.3 參數列表 195
8.3.4 函式體 195
8.3.5 函式原型 196
8.4 函式的參數 197
8.4.1 形參和實參 197
8.4.2 參數傳遞過程 198
8.4.3 值調用 198
8.4.4 引用調用 199
8.4.5 數組作為函式參數 201
8.4.6 指針作為函式參數 205
8.4.7 main()函式的參數 206
8.5 函式調用 208
8.5.1 函式調用方式 208
8.5.2 被調函式的說明 209
8.5.3 函式的返回值 210
8.6 幾種典型的函式調用形式 212
8.6.1 賦值調用與引用調用 212
8.6.2 嵌套調用 213
8.6.3 遞歸調用 215
8.7 函式及其變數的作用域 221
8.7.1 函式的作用域 221
8.7.2 函式的變數作用域 221
8.8 小結 222
第9章 指針 223
指針是C語言中廣泛使用的一種數據類型。利用指針可以操作各種基本的數據類型,以及數組等複合數據結構,甚至使用指針還可以訪問函式。正確理解和使用指針對於成功進行C語言程式設計是至關重要的。
指針是C語言最顯著的特徵,同時又是C語言最危險的特徵。例如,在使用指針的程式中,常常因為用錯指針導致程式出錯,而這類錯誤卻很難發現。更嚴重的是,對未初始化的指針進行操作可能會導致系統崩潰。
9.1 記憶體和變數 223
9.1.1 計算機記憶體 223
9.1.2 變數的存儲 224
9.2 指針和簡單變數 225
9.2.1 指針的概念 225
9.2.2 創建指針 226
9.2.3 初始化指針變數 227
9.2.4 指針變數的引用 228
9.2.5 給函式傳遞指針 232
9.3 指針變數的賦值 232
9.3.1 初始化賦值 232
9.3.2 取地址賦值 233
9.3.3 指針之間賦值 233
9.3.4 數組賦值 233
9.3.5 字元串賦值 234
9.3.6 函式入口賦值 234
9.4 指針和數組的關係 234
9.4.1 指針、數組和地址間的關係 234
9.4.2 指針變數的運算 236
9.4.3 用指針運算元組元素 237
9.5 指向多維數組的指針 240
9.5.1 理解二維數組的地址 240
9.5.2 多維數組的指針表示 242
9.5.3 指向多維數組的指針變數 243
9.5.4 數組名作為函式的參數 247
9.5.5 指向數組的指針小結 250
9.6 指針和字元串 251
9.6.1 字元串的指針表示 251
9.6.2 字元串指針作函式參數 253
9.6.3 字元數組和字元指針的區別 254
9.7 指針數組 256
9.7.1 指針數組的概念 256
9.7.2 用指針數組處理字元串 258
9.7.3 指針數組作函式參數 259
9.8 指向指針的指針 261
9.8.1 理解指向指針的指針 261
9.8.2 二級指針變數與數組 263
9.9 指針和函式 268
9.9.1 返回指針的函式 268
9.9.2 指向函式的指針 269
9.10 指針和const變數 272
9.10.1 用const控制指針 273
9.10.2 const的幾種特殊用法 274
9.11 指針總結 274
9.11.1 明確分辨各種指針類型 275
9.11.2 正確理解指針 275
9.12 小結 276
第10章 結構 277
在實際的程式設計中,經常需要處理具有不同數據類型的一組數據。例如,在學生成績統計表中,應該包含如下幾項:姓名(字元型)、學號(整型或字元型)、年齡(整型)、性別(字元型)和成績(整型或浮點型)。由於數組中各元素的類型和長度都必須一致,因此不能用一個數組存放這一組數據。在這種情況下,C語言中可以使用“結構”,這是一種構造數據類型,相當於其他高級語言中的記錄類型。
10.1 結構的定義 277
10.2 結構變數的定義 278
10.2.1 先定義結構,再定義結構變數 279
10.2.2 在定義結構的同時,定義結構變數 279
10.2.3 直接說明結構變數 279
10.3 結構變數的使用 280
10.4 結構變數的初始化 281
10.5 結構數組 283
10.5.1 結構數組的定義和引用 283
10.5.2 結構數組的初始化 285
10.5.3 結構數組實例 285
10.6 結構指針 286
10.6.1 定義結構指針 286
10.6.2 結構指針的引用 287
10.6.3 用指針處理結構數組 289
10.7 嵌套結構 291
10.7.1 包含數組的結構 291
10.7.2 包含指針的結構 292
10.7.3 包含結構的結構 292
10.8 向函式傳遞結構 296
10.8.1 傳遞結構變數的值 296
10.8.2 傳遞結構指針到函式 297
10.9 小結 298
第11章 聯合、枚舉和位域 299
在C語言中,除了數組和指針外,還定義了聯合和枚舉兩種聚合數據類型,並且可以進行類型說明和定義位域,這些是特殊形式的數據類型。下面分別進行講解。
11.1 聯合 299
11.1.1 定義联合類型 299
11.1.2 定義联合變數 300
11.1.3 聯合變數成員的引用 301
11.1.4 聯合變數數組 301
11.1.5 聯合變數指針 302
11.1.6 在結構中嵌套聯合類型 303
11.1.7 結構和聯合的區別 305
11.2 枚舉 306
11.2.1 定義枚舉類型 306
11.2.2 定義枚舉變數 307
11.2.3 枚舉類型變數的賦值 308
11.3 類型說明 310
11.4 二進制數據存儲 311
11.4.1 數據的存儲 312
11.4.2 不同數據類型的二進制表示 312
11.5 位運算 315
11.5.1 位邏輯運算符 315
11.5.2 移位運算符 318
11.5.3 位運算的複合賦值運算符 318
11.5.4 位運算的用途 319
11.6 位域 320
11.6.1 定義位域結構 320
11.6.2 位域變數的聲明 321
11.6.3 位域的使用 322
11.6.4 位域與聯合的使用 323
11.7 小結 324
第12章 預處理 325
C語言的程式中可包括各種以符號#開頭的編譯指令,這些指令稱為預處理命令。預處理命令屬於C語言編譯器,而不是C語言的組成部分。通過預處理命令可擴展C語言程式設計的環境。
預處理命令通常在程式編譯時進行一些符號處理,其並不執行具體的硬體操作。C語言中的預處理命令主要有宏定義指令、檔案包含指令和條件編譯指令,還有其他一些調試時使用的指令。本章將介紹預處理程式各命令的使用方法。
12.1 預處理簡介 325
12.1.1 預處理功能 325
12.1.2 預處理命令 325
12.2 宏定義命令 326
12.2.1 無參數的宏定義 326
12.2.2 帶參數的宏定義 329
12.2.3 #undef命令 331
12.2.4 預處理操作符#和## 331
12.3 檔案包含指令 334
12.4 條件編譯指令 335
12.4.1 #if、#else、#endif命令 336
12.4.2 #elif命令 337
12.4.3 #ifdef、#ifndef命令 339
12.4.4 使用#defined和#undef 340
12.5 其他預處理命令 340
12.5.1 預定義的宏名 340
12.5.2 重置行號和檔案名稱命令#line 341
12.5.3 修改編譯器設定命令#pragma 342
12.5.4 產生錯誤信息命令#error 342
12.6 內聯函式 343
12.7 小結 344
第13章 存儲管理 345
在大多數情況下,存儲管理都是作業系統的功能。一般的程式設計語言不提供對記憶體的管理。而C語言提供了管理記憶體的相關函式,可實現記憶體的動態存儲管理。這是C語言功能強大的一個表現,本章將介紹C語言的記憶體組織方式和動態存儲管理。
13.1 記憶體組織方式 345
13.1.1 記憶體組織方式 345
13.1.2 堆和棧的比較 346
13.2 C語言的動態存儲管理 347
13.3 分配記憶體函式——malloc() 347
13.4 帶初始化的分配記憶體函式——calloc() 349
13.5 調整已分配記憶體函式——realloc() 350
13.6 釋放分配的記憶體函式——free() 352
13.7 丟失的記憶體 354
13.8 小結 356
第2篇 C語言進階篇
第14章 字元及字元串操作 358
在實際的程式設計中,經常需要處理文本數據。在C語言中,文本數據按字元串格式保存。對於字元串,前面已經介紹過如何用字元數組保存字元串、用字元指針指向一個字元串常量、字元串的輸入與輸出函式等。
在C語言的庫函式中提供了豐富的處理字元及字元串的函式,本章將介紹這些函式的用法。
14.1 字元的操作 358
14.1.1 檢查英文字母函式 359
14.1.2 檢查字母數字函式 360
14.1.3 檢查控制字元函式 360
14.1.4 十進制數字檢查函式 361
14.1.5 可列印字元檢查函式 362
14.1.6 包含空格的可列印字元檢查函式 363
14.1.7 格式字元檢查函式 364
14.1.8 小寫英文字母檢查函式 365
14.1.9 大寫英文字母檢查函式 366
14.1.10 控制字元檢查函式 367
14.1.11 十六進制數字檢查函式 368
14.1.12 大寫字元轉換函式 368
14.1.13 小寫字元轉換函式 369
14.1.14 ASCII字元轉換函式 370
14.1.15 大寫字元宏轉換函式 371
14.1.16 小寫字元宏轉換函式 371
14.2 字元串的存儲 372
14.2.1 字元串的靜態存儲 372
14.2.2 字元串的動態存儲 373
14.3 字元串的操作 374
14.4 檢測字元串長度函式 375
14.5 查找字元串 376
14.5.1 查找字元位置函式——strchr() 376
14.5.2 查找相同字元函式——strspn() 378
14.5.3 查找包含字元位置函式——strcspn() 378
14.5.4 查找包含字元函式——strpbrk() 379
14.5.5 查找子串函式——strstr() 380
14.5.6 字元查找函式——memchr() 381
14.5.7 字元包含函式——strrchr() 382
14.6 比較字元串 383
14.6.1 比較字元串函式——strcmp() 383
14.6.2 比較部分字元串函式——memcmp() 384
14.6.3 比較時忽略大小寫函式——stricmp() 386
14.6.4 包含結束符的比較函式——strncmp() 387
14.7 連線字元串 388
14.7.1 連線字元串函式——strcat() 388
14.7.2 連線部分字元函式——strncat() 390
14.8 複製字元串 391
14.8.1 複製字元串函式——strcpy() 391
14.8.2 複製部分字元函式——strncpy() 392
14.8.3 更省事的複製函式——strdup() 393
14.8.4 字元串複製函式——memcpy() 394
14.8.5 帶終止字元的複製函式——memccpy() 395
14.8.6 字元串移動函式——memmove() 395
14.9 字元和字元串的轉換 396
14.9.1 大小寫字元的轉換 396
14.9.2 轉換大小寫字元串 397
14.9.3 字元串與數值的轉換 398
14.10 其他字元串函式 399
14.10.1 字元串反轉函式——strrev() 399
14.10.2 替換字元串中的字元函式——strset() 400
14.10.3 分解字元串函式——strtok() 401
14.10.4 字元串填充函式——memset() 402
14.11 小結 403
第15章 檔案操作 404
在前面各章的實例程式中,每次執行程式時,需要用戶從鍵盤上輸入數據,並將程式運行結果輸出到螢幕上。在實際的套用中,可能需要將計算機的處理結果列印輸出或保存到一個檔案中,以供其他用戶查看。當程式需要處理大量數據時,可能還需要從一個檔案中讀取這些數據。C語言提供了豐富的檔案操作函式。本章將介紹操作檔案的常用函式。
15.1 檔案與數據流 404
15.1.1 程式的輸入/輸出概念 404
15.1.2 流的概念 404
15.1.3 預定義的流 405
15.1.4 檔案的基本概念 405
15.1.5 緩衝檔案系統 406
15.2 檔案的打開與關閉 406
15.2.1 檔案指針 406
15.2.2 打開檔案函式——fopen() 407
15.2.3 關閉檔案函式——fclose() 409
15.3 從檔案中讀寫字元 409
15.3.1 寫字元函式——putc()和fputc() 410
15.3.2 讀字元函式——getc()和fgetc() 411
15.3.3 合併檔案 413
15.4 從檔案中讀寫字元串 414
15.4.1 寫字元串函式——fputs() 414
15.4.2 讀字元串函式——fgets() 416
15.4.3 檔案格式輸出函式——fprintf() 417
15.4.4 檔案格式輸入函式——fscanf() 418
15.5 二進制檔案的讀寫 420
15.5.1 寫入整型數據函式——putw() 421
15.5.2 讀取整型數據函式——getw() 422
15.5.3 寫數據塊函式——fwrite() 423
15.5.4 讀數據塊函式——fread() 425
15.5.5 檔案檢測函式 426
15.6 檔案的隨機讀寫 427
15.6.1 獲取當前位置函式——ftell() 427
15.6.2 重置檔案位置指針函式——rewind() 429
15.6.3 設定檔案位置指針——fseek()函式 430
15.7 管理緩衝區 432
15.8 輸入/輸出的重定向 433
15.8.1 作業系統的重定向功能 433
15.8.2 重定向輸出 434
15.8.3 重定向函式——freopen() 435
15.9 檔案管理 436
15.9.1 重命名檔案 436
15.9.2 刪除檔案 437
15.9.3 複製檔案 438
15.9.4 創建臨時檔案 439
15.10 小結 441
第16章 典型庫函式套用 442
前面曾經介紹過C語言中的字元及字元串處理函式。在實際套用中,其實還有很多其他方面的套用。例如數學運算或繪圖程式中需要用到大量的數學函式,而另一些程式中可能需要處理日期和時間類的數據等。在C語言中,還提供了一些庫函式用於數學和時間處理等。本章將介紹C語言程式設計中,這些典型的庫函式套用。
16.1 隨機函式 442
16.1.1 偽隨機函式——rand() 442
16.1.2 隨機種子函式——srand() 443
16.1.3 更加合理的隨機數產生方法 444
16.1.4 獲取任意範圍的隨機數 445
16.1.5 獲取隨機字元 446
16.2 數學函式 447
16.2.1 絕對值函式 448
16.2.2 三角函式 448
16.2.3 雙曲三角函式 449
16.2.4 指數函式和對數函式 450
16.2.5 取整函式 452
16.2.6 浮點型分離函式 453
16.2.7 冪函式 454
16.2.8 取余函式 454
16.2.9 C99中擴展的數學函式 455
16.3 日期時間函式 455
16.3.1 表示日期時間的數據結構 455
16.3.2 獲取日期時間 456
16.3.3 轉換日期時間的表示形式 457
16.3.4 格式化日期時間 460
16.4 小結 463
第17章 模組化程式設計方法 464
C語言提供支持模組化軟體開發的功能,如C語言的程式整體由一個或多個函式組成,每個函式都具有各自獨立的功能。這些函式還可分布在不同的源檔案中,在需要時包含到C主程式中即可。C語言還允許通過使用不同存儲類別的變數,控制模組內部及外部的信息交換。
本章首先簡單介紹模組化設計的概念,接著介紹C程式模組的結構,最後詳細介紹C語言中不同存儲類別變數的使用。
17.1 模組化程式設計概念 464
17.2 程式模組結構 465
17.2.1 C程式的組織 465
17.2.2 多檔案模組的編譯連結 467
17.2.3 檔案包含 470
17.2.4 內部函式與外部函式 471
17.3 變數的作用域 472
17.3.1 局部變數 472
17.3.2 在複合語句中的變數 473
17.3.3 全局變數 474
17.3.4 全局變數和局部變數同名 477
17.4 變數的存儲類型 477
17.4.1 了解存儲類型 478
17.4.2 自動變數 478
17.4.3 暫存器變數 480
17.4.4 外部變數 481
17.4.5 靜態變數 482
17.5 函式、檔案、變數的關係 485
17.6 小結 486
第18章 典型算法套用 487
算法是對特定問題求解步驟的描述。對於同一個問題,可能用不同算法來求解,程式設計師可根據算法的可讀性、效率等進行取捨。針對不同的數據保存方式,也會有不同的算法。本章將重點介紹C語言程式設計中的常用算法,也會穿插著簡單介紹常用數據和數據結構的內容。
18.1 排序 487
18.1.1 排序概述 487
18.1.2 冒泡排序法 488
18.1.3 選擇排序法 489
18.1.4 插入排序法 491
18.1.5 shell排序法 492
18.1.6 快速排序法 494
18.1.7 字元串數組的排序 496
18.1.8 字元串的排序 498
18.2 查找 499
18.2.1 順序查找 499
18.2.2 折半查找 501
18.3 佇列 503
18.3.1 佇列的概念 504
18.3.2 佇列的操作 504
18.4 堆疊 508
18.4.1 堆疊的概念 508
18.4.2 堆疊的實現 508
18.5 鍊表 512
18.5.1 鍊表的概念 512
18.5.2 鍊表的基本操作 513
18.5.3 測試鍊表的功能 517
18.6 小結 518
第19章 圖形繪製 519
到目前為止,本書所有的操作都是針對文本模式進行的。從本章開始將帶領讀者進入一個新的模式——圖形模式,主要介紹圖形顯示的相關技術,包括各種圖形的繪製及圖形的編輯。本章介紹的是DOS界面下的圖形編譯,將使用DJGPP開發環境編寫相關程式。
19.1 顯示系統簡介 519
19.1.1 顯示系統基本概念 519
19.1.2 顯示卡種類 520
19.1.3 顯示模式 520
19.2 DJGPP開發環境 522
19.2.1 下載DJGPP開發環境 522
19.2.2 安裝DJGPP開發環境 523
19.2.3 測試DJGPP開發環境 524
19.2.4 調用中斷服務 525
19.3 繪圖基礎 526
19.3.1 設定顯示模式 527
19.3.2 控制顯示緩衝區 527
19.4 圖形函式 528
19.4.1 繪製點 528
19.4.2 讀取點的信息 529
19.4.3 繪製直線 530
19.4.4 繪製矩形 532
19.4.5 繪製圓 532
19.4.6 繪製多邊形 534
19.5 編輯圖形 536
19.5.1 複製圖形 536
19.5.2 移動圖形 536
19.5.3 保存圖形 537
19.5.4 載入圖形 537
19.6 小結 539
第20章 滑鼠控制 540
在前面的程式設計中,需要進行人機互動的時候都是採用鍵盤輸入的。除鍵盤之外,滑鼠是計算機中用得最多的輸入設定。特別是Windows作業系統的普及,使滑鼠成為了計算機一個必備的輸入設備。本章將介紹在C語言中控制滑鼠的方法。
20.1 滑鼠驅動程式 540
20.1.1 通過中斷訪問滑鼠驅動程式 540
20.1.2 DJGPP開發環境對中斷的支持 541
20.2 滑鼠庫函式 541
20.2.1 定義頭檔案mouse.h 541
20.2.2 通過中斷控制滑鼠 542
20.2.3 初始化滑鼠 543
20.2.4 復位滑鼠 544
20.2.5 移動滑鼠 544
20.2.6 顯示滑鼠指針 545
20.2.7 隱藏滑鼠指針 545
20.2.8 獲取按下的按鍵信息 546
20.2.9 獲取釋放的按鍵信息 546
20.2.10 獲取滑鼠狀態信息 547
20.2.11 獲取滑鼠指針位置信息 548
20.2.12 保存滑鼠指針位置 548
20.2.13 捕獲鍵盤或滑鼠 549
20.2.14 滑鼠指針區域 550
20.3 滑鼠套用實例 551
20.3.1 了解螢幕函式 551
20.3.2 實例程式 552
20.4 小結 554
第3篇 C語言接口篇
第21章 C語言與彙編的接口 556
C語言的強大在於其和現代很多主流的程式語言都可以進行嵌套編程,各種程式語言都提供了和C語言的接口。從本章開始,將介紹目前主流的程式語言與C語言的接口方式及程式設計。
21.1 AT&T彙編簡介 556
21.1.1 了解彙編的兩種格式 556
21.1.2 將C語言輸出為彙編程式 558
21.2 GCC內嵌彙編 559
21.2.1 基本內聯彙編 559
21.2.2 擴展內聯彙編 559
21.2.3 內聯彙編實例 563
21.3 調用彙編程式 564
21.3.1 C編譯程式的調用約定 565
21.3.2 C語言調用彙編的結構 566
21.3.3 建立彙編函式的框架 567
21.3.4 調用彙編函式 567
21.4 在Visual C++中調用彙編 569
21.4.1 內聯彙編關鍵字 569
21.4.2 在__asm塊中使用彙編語言 570
21.4.3 在__asm塊中使用C/C++語言元素 571
21.4.4 暫存器的使用 572
21.4.5 跳轉 572
21.4.6 內聯彙編調用函式實例 573
21.4.7 內聯彙編的優缺點 574
21.5 小結 574
第22章 C語言與LabVIEW的接口 575
虛擬儀器軟體設計是目前比較流行的程式設計方法,其以圖形化語言LabVIEW為主。通過LabVIEW可以方便、快捷地創建各種控制及數據採集系統。但在遇到LabVIEW不易實現的功能時,可通過在LabVIEW中調用C實現。本章介紹在LabVIEW中調用C的方法和配置CIN節點的原則,並通過例子詳細說明實現LabVIEW和C混合編程的過程。
22.1 LabVIEW概述 575
22.1.1 虛擬儀器概述 575
22.1.2 虛擬儀器與傳統儀器的對比 576
22.1.3 虛擬儀器的優勢 577
22.1.4 什麼是LabVIEW 577
22.1.5 LabVIEW的運行機制 578
22.2 CIN節點 580
22.2.1 CIN概述 580
22.2.2 支持在LabVIEW中調用的CIN的編譯器 580
22.2.3 CIN節點說明 581
22.3 CIN節點的設計方法 582
22.3.1 創建CIN節點的基本方法 582
22.3.2 創建CIN節點 582
22.3.3 創建.c源檔案 583
22.3.4 編譯.c檔案 585
22.3.5 載入.lsb檔案 587
22.4 CIN節點的多執行緒運行 587
22.5 小結 587
第23章 C語言與MATLAB的接口 588
MATLAB作為世界頂尖的數學套用軟體,以其強大的工程計算、算法研究、工程繪圖、應用程式開發、數據分析和動態仿真等功能,在各個領域發揮著越來越重要的作用。雖然MATLAB是一個完整的、功能齊全的編程環境,但在某些情況下,與外部環境的數據和程式的互動是非常必須而且有益的。而C語言是目前套用最廣的程式語言,其功能豐富,使用靈活方便,目標程式效率高,既有高級語言的優點,又有低級語言的特點。本章將介紹C語言與MATLAB的接口。
23.1 MATLAB簡介 588
23.1.1 MATLAB簡介 588
23.1.2 MATLAB的版本演化 589
23.1.3 MATLAB的優勢 591
23.1.4 MATLAB常用工具箱 593
23.1.5 C語言與MATLAB的接口 593
23.2 MATLAB引擎 594
23.2.1 MATLAB引擎簡介 594
23.2.2 MATLAB引擎的工作方式 595
23.2.3 配置Visual C++編譯器 595
23.2.4 MATLAB引擎API詳解 596
23.2.5 數據類型mxArray的操作 598
23.2.6 MATLAB引擎實例 600
23.3 COM組件 603
23.3.1 使用deploytool 603
23.3.2 使用comtool 608
23.4 MEX檔案 611
23.4.1 MATLAB編譯器簡介 611
23.4.2 MATLAB編譯器的安裝與配置 612
23.4.3 C語言的MEX檔案的結構 614
23.4.4 C語言的MEX檔案實例 615
23.4.5 MEX檔案的優勢 616
23.4.6 常用的mex函式和mx函式 618
23.4.7 C-MEX檔案字元串操作實例 620
23.5 使用Matcom 622
23.6 小結 622
第24章 C語言與JavaScript的接口 623
JavaScript(簡稱JS)在瀏覽器中的套用幾乎是盡人皆知的。實際上,JavaScript技術也可以使用在非瀏覽器應用程式當中,從而讓應用程式具有自動的腳本功能。本章將介紹一種功能非常強大的JavaScript-C引擎,通過其可以使C程式能夠解釋執行JavaScript腳本。
24.1 JavaScript簡介 623
24.1.1 什麼是JavaScript 623
24.1.2 JavaScript基本特點 624
24.1.3 正確認識JavaScript 624
24.1.4 JavaScript的基本概念 624
24.1.5 JavaScript的運行環境 627
24.2 JavaScript-C引擎 627
24.2.1 JavaScript-C引擎的由來 627
24.2.2 獲取JavaScript-C引擎 628
24.2.3 JavaScript-C引擎支持的版本 628
24.2.4 運行JavaScript-C引擎的條件 628
24.2.5 JavaScript-C引擎與應用程式的關係 629
24.3 JavaScript-C引擎開發 631
24.3.1 嵌入JavaScript-C引擎的必要條件 631
24.3.2 管理一個運行時 632
24.3.3 管理上下文 633
24.3.4 初始化內置的和全局的JavaScript對象 634
24.3.5 創建和初始化自定義對象 634
24.3.6 JavaScript類型的處理 635
24.4 在C/C++中執行JavaScript程式 636
24.4.1 創建 JavaScript 運行時環境 636
24.4.2 創建一個上下文 637
24.4.3 初始化全局對象 637
24.4.4 執行腳本 637
24.4.5 清理腳本引擎 638
24.5 JavaScript-C引擎的編譯 638
24.6 JavaScript-C引擎實例 639
24.6.1 建立項目 639
24.6.2 C源檔案 640
24.7 小結 642
第25章 C語言硬體連線埠操作 643
C語言既有高級語言的特點,又有低級語言的特點,這主要體現在C語言可以對硬體連線埠進行操作。在Turbo C中可以直接對並行接口進行操作,在其他開發環境中可以通過嵌入彙編語言或者使用相應的庫檔案實現並行接口操作。本章以計算機並行接口的操作為例,向讀者展示C語言的硬體連線埠操作能力。
25.1 並行連線埠簡介 643
25.1.1 認識計算機並口 643
25.1.2 並口的引腳定義 643
25.1.3 並口的工作模式 644
25.1.4 並口暫存器定義 645
25.1.5 並口開發調試工具包 646
25.2 Turbo C下的並口操作 647
25.2.1 連線埠操作函式 648
25.2.2 並口讀寫實例 648
25.3 其他C語言環境下的並口操作 649
25.3.1 連線埠開發庫函式 649
25.3.2 並口讀寫實例 651
25.4 小結 652
第4篇 C語言擴展篇
第26章 Linux下的C語言開發 654
Linux作業系統在伺服器領域的套用和普及已經有較長的歷史,這源於它的開源特點及其超越Windows的安全性和穩定性。Linux的大部分代碼都是用C語言開發的,在Linux作業系統中進行程式開發時首選程式設計語言為C語言。本章將簡單介紹Linux,以及在Linux中使用C語言編寫程式的方法。
26.1 Linux簡介 654
26.2 Linux常用命令詳解 655
26.2.1 檔案管理 656
26.2.2 檔案傳輸 659
26.2.3 文檔編輯 660
26.2.4 系統管理 662
26.2.5 系統設定 666
26.2.6 網路通信 669
26.2.7 磁碟管理 672
26.2.8 磁碟維護 675
26.2.9 備份壓縮 677
26.2.10 設備管理 678
26.3 Linux C語言開發環境 679
26.3.1 Linux C開發環境的構成 679
26.3.2 代碼編輯器 680
26.3.3 GCC編譯器 681
26.4 Linux下的C程式開發 682
26.4.1 在emacs中編譯C程式 682
26.4.2 在Linux中編寫C程式 683
26.5 小結 685
第27章 單片機的C語言開發 686
C語言是目前最為流行的程式語言,它的成功也延續到了其他領域。單片機便是一個重要的例子。在傳統的單片機程式設計中,一般採用彙編語言實現。而後來,單片機的開發全面借鑑了C語言,從而進入了C語言開發單片機的時代。本章將介紹單片機的C語言開發及其與標準C語言的一些區別。
27.1 單片機簡介 686
27.1.1 單片機的發展 686
27.1.2 51系列單片機 687
27.1.3 認識單片機 687
27.1.4 單片機的結構 688
27.1.5 單片機的套用領域 690
27.2 單片機C語言簡介 690
27.2.1 單片機C語言和彙編語言的對比 691
27.2.2 單片機C語言的特點 691
27.3 單片機C語言的開發工具 691
27.3.1 Keil μVision3簡介 691
27.3.2 Keil μVision3的系統需求 692
27.3.3 Keil μVision3集成開發環境 692
27.4 單片機C語言開發實例 693
27.4.1 創建項目 693
27.4.2 創建源檔案 694
27.4.3 編譯項目 695
27.4.4 仿真調試 696
27.5 單片機C語言與標準C語言的區別 696
27.5.1 標識符 696
27.5.2 關鍵字 697
27.5.3 數據類型 697
27.5.4 中斷函式 697
27.5.5 存儲類型 698
27.5.6 擴展數據類型 700
27.5.7 存儲模式 702
27.5.8 指針 703
27.5.9 遞歸或可重入函式指定 704
27.6 小結 705
第28章 嵌入式系統C語言開發 706
嵌入式系統(Embeded System)是目前最為流行的一門技術。嵌入式系統不僅和一般的PC機上的套用系統不同,就是針對不同的具體套用而設計的嵌入式系統之間差別也很大。這就導致嵌入式系統的開發與PC機不同。目前使用最多的便是基於Linux的嵌入式系統。本章將介紹嵌入式Linux系統下的C語言開發工具和開發流程。
28.1 嵌入式系統簡介 706
28.1.1 什麼是嵌入式系統 706
28.1.2 嵌入式系統的基本結構 707
28.1.3 嵌入式系統的特點 707
28.1.4 嵌入式系統中的處理器 707
28.1.5 嵌入式作業系統 708
28.1.6 嵌入式系統中的軟體系統 709
28.2 嵌入式Linux C語言開發工具 710
28.2.1 編輯器VIM 710
28.2.2 編譯器GCC 715
28.2.3 GCC的常用編譯選項 717
28.2.4 調試器GDB 720
28.2.5 工程管理 MAKE 725
28.3 集成開發環境Eclipse 730
28.3.1 Eclipse的安裝 730
28.3.2 Eclipse的界面簡介 732
28.3.3 創建Hello項目 733
28.3.4 調試Hello項目 735
28.4 嵌入式C語言開發流程 735
28.4.1 命令行下的開發流程 735
28.4.2 基於Eclipse的開發流程 739
28.5 小結 743
第29章 基於C語言的高性能並行GPU編程 744
普通的C語言程式運行在CPU上,都是順序執行的語句。目前,並行計算是高性能計算的一個方面。如何將C語言的簡單易學、功能強大的特點與並行計算結合起來是一個研究方向。現在,普通用戶可以通過顯示卡GPU運行C程式實現並行計算,提供程式的計算性能。本章將介紹如何使用C語言和NVIDIA的GPU進行並行編程。
29.1 GPU概述 744
29.1.1 GPU和CPU 744
29.1.2 GPU的作用 744
29.1.3 GPU的優勢 745
29.1.4 GPU的供應商 747
29.1.5 GPU的開發環境 748
29.2 基於C語言的CUDA 748
29.2.1 什麼是CUDA 748
29.2.2 CUDA的發展歷史 749
29.2.3 CUDA基本構架 750
29.2.4 CUDA編程模型 752
29.2.5 CUDA硬體實現 753
29.3 CUDA應用程式編程接口(API) 754
29.3.1 CUDA編程接口的構成 754
29.3.2 CUDA對C語言的擴展 754
29.3.3 NVCC編譯 756
29.3.4 公共運行時(Runtime)組件 757
29.3.5 設備運行時組件 758
29.3.6 主機運行時組件 761
29.3.7 CUDA運行時API詳解 762
29.3.8 CUDA驅動程式API詳解 772
29.4 在Visual Studio中使用CUDA 784
29.4.1 安裝CUDA 784
29.4.2 配置CUDA NVCC 786
29.4.3 使用第三方工具配置CUDA NVCC 789
29.5 CUDA並行編程實例 790
29.5.1 初始化CUDA實例 791
29.5.2 GPU運算實例 792
29.6 小結 794