C語言開發手冊(典藏版)

C語言開發手冊(典藏版)

《C語言開發手冊(典藏版)》是2011年3月出版的圖書,作者是薛園園 等。

宣傳語

百科全書式的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

相關詞條

熱門詞條

聯絡我們