內容簡介
本書站在零基礎學習的角度,使初學者能儘快掌握C語言程式設計的精髓,並且少走彎路。在知識點講解時,筆者採用由淺入深的逐級遞進學習方式。本書一共分為4篇,循序漸進地講述了C語言的語法規則和編程思想,從基本概念到具體實踐、從入門知識到高階主題、從語法語義到數據結構和算法都進行了詳細的闡述。主要內容包括數據的存儲和獲取、螢幕的輸入與輸出、運算符、表達式、分支語句、循環語句、函式、數組、指針、字元串處理、結構體、共用體、枚舉、位運算、檔案處理、作用域、預處理、數據結構等知識點。最後一章通過一些常見的C語言面試題的解析,為讀者踏入職場提供參考資料。
本書非常適合無C語言基礎或基礎薄弱的程式設計師閱讀,並可作為開發人員的參考手冊。
目錄
前言
第一篇 C語言基礎
第1章 踏上征程前的思想動員
1.1 為什麼選擇C語言
1.2 如何學好C語言
1.3 語言概述
1.3.1 什麼是語言
1.3.2 什麼是機器語言
1.3.3 什麼是彙編語言
1.3.4 面向過程的語言
1.3.5 什麼是C語言
1.4 深刻認識程式如何開發出來—程式開發周期
1.4.1 編輯C原始碼
1.4.2 編譯C原始碼
1.4.3 連線目標檔案
1.4.4 編譯連線過程示例
1.4.5 運行程式
1.5 VC++、C++、C和TC—認識開發環境和語言的區別
1.6 小結
1.7 上機實踐
第2章 跟我寫Hello World
2.1 自己動手創建程式
2.2 認識LCC-Win32開發環境
2.2.1 為什麼選擇LCC-Win32
2.2.2 啟動LCC-Win32
2.2.3 新建Hello World工程
2.2.4 定義新工程
2.2.5 添加原始碼到工程
2.2.6 編譯器設定
2.2.7 連線器設定
2.2.8 調試器設定
2.2.9 開始編輯代碼
2.3 編譯運行—欣賞你的傑作
2.4 查看代碼如何一步一步被執行—調試排錯(debug)
2.4.1 debug一詞的由來
2.4.2 設定斷點
2.4.3 調試運行
2.5 小結
2.6 上機實踐
第3章 分解HelloWorld—最簡單C程式的組成
3.1 C程式概貌
3.2 為何有必要在代碼里留下程式設計師的解釋—注釋
3.3 從哪裡開始,到哪裡結束—main函式
3.4 如何在螢幕上顯示文字—函式調用
3.5 編譯器如何認識printf函式—#include預處理器指示符
3.5.1 函式聲明及其作用
3.5.2 試驗尋找#include的作用
3.5.3 #include的作用
3.6 計算1+1—有些小作為的程式
3.7 數據從哪裡來,又到哪裡去—變數
3.7.1 變數在記憶體中的表現形式
3.7.2 編譯器使用變數符號表
3.7.3 變數及其使用
3.8 自己設計C函式
3.8.1 在main函式中計算3個整數的平均數
3.8.2 在main函式中分3次計算3個整數的平均數
3.8.3 自編函式實現計算3個整數的平均數
3.8.4 如何自編寫函式
3.8.5 試驗觀察總結函式聲明和函式定義的意義
3.9 語句構成程式
3.10 向好程式設計師看齊—代碼風格
3.11 小結
3.12 上機實踐
第4章 如何存儲和獲取數據—變數及數據類型
4.1 二進制、八進制、十六進制
4.2 計算機中如何表示數據—位元組和位
4.3 記憶體是存儲數據的“房間”—認識計算機記憶體
4.4 數據類型
4.4.1 整數類型
4.4.2 整數的正負—有符號和無符號
4.4.3 實數類型
4.4.4 字元類型
4.4.5 數據類型總結
4.5 常量
4.5.1 直接常量(字面常量)和符號常量
4.5.2 符號常量的優點
4.5.3 字面常量的書寫格式
4.5.4 轉義字元
4.5.5 字元串
4.6 變數
4.6.1 變數的聲明
4.6.2 變數聲明的意義
4.6.3 標識符和關鍵字
4.6.4 變數在記憶體中占據的空間和變數的值
4.6.5 變數賦初值
4.7 幾個與變數相關的經典算法
4.7.1 累加和累乘
4.7.2 交換兩個變數的值
4.8 小結
4.9 上機實踐
第5章 用螢幕和鍵盤互動—簡單的輸出和輸入
5.1 輸入—處理—輸出:這就是程式
5.2 向螢幕輸出—printf函式詳解
5.2.1 printf函式的一般形式
5.2.2 格式字元串的一般形式
5.2.3 %d—十進制形式輸出帶符號整數
5.2.4 %最小寬度d格式符
5.2.5 %ld格式符—以長整型方式輸出
5.2.6 %o格式符—以八進制形式輸出整數
5.2.7 %x格式符—以十六進制的形式輸出整數
5.2.8 %u格式符—以十進制形式輸出unsigned型數據
5.2.9 %c格式符
5.2.10 %s格式符—輸出字元串
5.2.11 %f格式符—輸出實型數據
5.2.12 %e格式符—以指數形式輸出實數
5.2.13 %g格式符—自動選擇%f或者%e形式輸出
5.2.14 printf函式小結
5.3 字元輸出putchar和字元串輸出puts
5.3.1 putchar函式(字元輸出函式)
5.3.2 puts函式(字元串輸出函式)
5.4 接收鍵盤輸入—scanf函式詳解
5.4.1 一般形式
5.4.2 scanf函式的工作原理
5.4.3 多數據輸入分隔規則
5.4.4 格式字元
5.4.5 scanf使用方法說明
5.4.6 使用scanf函式的注意事項
5.5 字元輸入函式getchar
5.6 輸入輸出程式舉例
5.7 小結
5.8 上機實踐
第6章 程式的基本構成—運算符和表達式
6.1 認識C中的運算符和表達式
6.1.1 認識運算符和表達式
6.1.2 運算元、運算符和表達式
6.1.3 C運算符簡介
6.2 算術運算符和算術表達式
6.2.1 基本的算術運算符
6.2.2 ++自增、--自減運算符
6.2.3 算術表達式和運算符的優先權及結合性
6.3 逗號運算符和逗號表達式
6.3.1 逗號表達式的一般形式
6.3.2 逗號表達式的優先權和結合性
6.4 關係運算符和關係表達式
6.4.1 關係運算符的種類
6.4.2 關係表達式的一般形式
6.5 邏輯運算符和邏輯表達式
6.5.1 邏輯運算符
6.5.2 邏輯真值表
6.6 賦值運算符和賦值表達式
6.6.1 賦值表達式
6.6.2 複合賦值運算符
6.6.3 類型轉換
6.6.4 左值與程式實體
6.7 強制類型轉換和自動類型轉換
6.7.1 強制類型轉換
6.7.2 自動類型轉換
6.7.3 函式調用時的轉換
6.8 運算符的優先權
6.8.1 優先權、結合性匯總
6.8.2 短路表達式
6.8.3 sizeof運算符與sizeof表達式
6.9 小結
6.10 上機實踐
第7章 程式的最小獨立單元—語句
7.1 5種語句類型
7.1.1 表達式語句
7.1.2 函式調用語句
7.1.3 空語句
7.1.4 複合語句(塊語句)
7.1.5 流程控制語句
7.2 結構化程式設計
7.2.1 什麼是算法
7.2.2 算法的表示
7.2.3 算法的偽代碼表示
7.2.4 算法的流程圖表示
7.2.5 3種控制結構
7.2.6 算法示例
7.3 小結
7.4 上機實踐
第8章 條件判斷—分支結構
8.1 簡單的條件判斷—if語句
8.1.1 判斷表達式
8.1.2 花括弧和if結構體
8.2 兩條岔路的選擇—if else結構
8.2.1 關鍵在else
8.2.2 if else結構體
8.3 多分支語句和分支語句嵌套
8.3.1 多分支
8.3.2 多分支if結構
8.3.3 分支語句嵌套
8.4 開關語句—switch結構
8.4.1 一般形式
8.4.2 為什麼叫開關語句
8.4.3 default語句
8.4.4 if結構和switch結構之比較
8.5 小結
8.6 上機實踐
第9章 一遍又一遍—循環結構
9.1 構造循環
9.1.1 循環的條件
9.1.2 當型循環和直到型循環
9.2 簡潔循環語句—while和do while結構
9.2.1 語法規則
9.2.2 代碼塊
9.3 最常用的循環語句—for結構
9.3.1 基本形式
9.3.2 表達式省略
9.3.3 循環終止和步長
9.4 循環嵌套
9.4.1 嵌套示例
9.4.2 嵌套的效率
9.5 與循環密切相關的流程轉向控制語句
9.5.1 跳出循環—break
9.5.2 重來一次—continue
9.5.3 隨心所欲—goto
9.6 小結
9.7 上機實踐
第二篇 一窺C語言門庭
第10章 寫程式就是寫函式—函式入門
10.1 什麼是函式—根據輸入進行處理返回輸出
10.1.1 分割
10.1.2 庫函式和自定義函式
10.2 自定義函式
10.2.1 定義的語法
10.2.2 函式定義範例
10.2.3 不要重複定義
10.3 函式調用與返回
10.3.1 形參和實參
10.3.2 傳址調用
10.3.3 函式返回
10.4 告訴編譯器有這么一個函式—函式原型聲明
10.4.1 函式聲明的語法
10.4.2 聲明不同於定義
10.4.3 標準庫函式的聲明
10.5 面向過程的程式結構
10.5.1 模組化
10.5.2 函式的調用過程—模組的配合
10.5.3 一個入口一個出口
10.5.4 自頂向下,逐步求精
10.5.5 封裝和可重用
10.5.6 高內聚,低耦合
10.6 小結
10.7 上機實踐
第11章 同一類型多個元素的集合—簡單數組
11.1 什麼是數組
11.1.1 數組是一大片連續記憶體空間
11.1.2 數組元素的訪問
11.2 一維數組
11.2.1 一維數組的聲明
11.2.2 一維數組元素的訪問
11.2.3 數組的初始化
11.2.4 不合法的數組操作
11.3 二維數組
11.3.1 二維數組的聲明
11.3.2 二維數組的初始化
11.3.3 二維數組套用舉例
11.4 更高維的數組
11.4.1 高維數組的聲明和元素訪問
11.4.2 初始化
11.4.3 多維數組在記憶體中是如何排列元素的
11.5 小結
11.6 上機實踐
第12章 C語言難點—指針初探
12.1 計算機中的記憶體
12.1.1 記憶體地址
12.1.2 記憶體中保存的內容
12.1.3 地址就是指針
12.2 指針的定義
12.2.1 指針變數的聲明
12.2.2 指針變數的初始化
12.2.3 指針變數的值
12.2.4 取地址操作符&
12.2.5 指針變數占據一定的記憶體空間
12.2.6 指向指針的指針
12.3 使用指針
12.3.1 運算符*
12.3.2 指針的類型和指針所指向的類型
12.3.3 同類型指針的賦值
12.3.4 指針的類型和指針所指向的類型不同
12.4 指針的運算
12.4.1 算術運算之“指針+整數”或“指針-整數”
12.4.2 指針-指針
12.4.3 指針的大小比較
12.5 指針表達式與左值
12.5.1 指針與整型
12.5.2 指針與左值
12.5.3 指針與const
12.6 動態記憶體分配
12.6.1 動態分配的好處
12.6.2 malloc與free函式
12.6.3 calloc與free函式
12.6.4 free函式與指針
12.6.5 記憶體泄漏
12.6.6 釋放已經釋放了的記憶體會出問題
12.7 小結
12.8 上機實踐
第13章 字元串及字元串操作
13.1 C風格字元串
13.1.1 C風格字元串的聲明
13.1.2 C風格字元串在記憶體中的表示
13.2 字元數組的輸入輸出
13.2.1 字元數組可以進行整體輸入輸出
13.2.2 使用gets函式讀入整行輸入
13.2.3 訪問字元數組中某個元素
13.2.4 更便捷的輸出—使用puts函式
13.3 字元串處理函式
13.3.1 理解:數組名是常指針
13.3.2 strlen函式與size_t
13.3.3 字元串複製函式strcpy
13.3.4 字元串比較函式strcmp
13.3.5 字元串連線函式strcat
13.3.6 全轉換為大寫形式
13.3.7 鏈式操作
13.4 小結
13.5 上機實踐
第14章 結構體、共用體、枚舉和typedef
14.1 結構體
14.1.1 結構體的定義
14.1.2 聲明結構體變數
14.1.3 初始化結構變數
14.1.4 訪問結構體成員
14.1.5 結構體定義的位置
14.1.6 結構體變數賦值
14.2 特殊結構體
14.2.1 結構體嵌套
14.2.2 匿名結構體
14.3 共用體
14.3.1 什麼是共用體
14.3.2 共用體的定義
14.3.3 聲明共用體變數
14.3.4 共用體變數的初始化
14.3.5 共用體成員訪問
14.3.6 共用體賦值
14.4 結構體和共用體的記憶體差異
14.4.1 結構體變數和共用體變數記憶體形式的不同
14.4.2 結構體變數的記憶體大小
14.4.3 位元組對齊
14.4.4 最寬基本類型
14.4.5 共用體的大小
14.5 枚舉類型
14.5.1 枚舉類型的定義
14.5.2 聲明枚舉變數
14.5.3 枚舉常量是什麼
14.6 給類型取個別名—typedef
14.6.1 typedef基本用法
14.6.2 #define用法
14.7 小結
14.8 上機實踐
第15章 如何節省記憶體—位運算
15.1 什麼是位運算
15.1.1 開燈關燈
15.1.2 改變狀態
15.2 位邏輯運算符
15.2.1 位取反操作
15.2.2 位與運算
15.2.3 位或運算
15.2.4 位異或
15.2.5 實例分析
15.3 移位運算
15.3.1 基本形式
15.3.2 移位舉例
15.4 小結
15.5 上機實踐
第三篇 C語言進階
第16章 存儲不僅僅局限於記憶體—檔案
16.1 什麼是檔案
16.1.1 檔案
16.1.2 流
16.1.3 重定向
16.1.4 檔案的處理形式—緩衝區和非緩衝區
16.1.5 檔案的存儲形式—文本形式和二進制形式
16.2 C語言如何使用檔案
16.2.1 檔案型指針
16.2.2 檔案操作的步驟
16.3 檔案的打開與關閉
16.3.1 打開檔案—fopen
16.3.2 打開是否成功
16.3.3 關閉檔案—fclose
16.4 檔案的讀寫
16.4.1 讀寫的相對參照
16.4.2 如何判斷檔案已經結束
16.4.3 字元讀寫函式—fgetc和fputc
16.4.4 字元串讀寫函式—fgets和fputs
16.4.5 塊讀寫函式—fread和fwrite
16.4.6 格式化檔案輸入輸出—fprintf與fscanf
16.5 檔案的定位
16.5.1 移到開頭—rewind
16.5.2 得到當前位置—ftell
16.5.3 移動指針—fseek
16.6 小結
16.7 上機實踐
第17章 靈活卻難以理解—指針進階
17.1 指針與數組
17.1.1 數組名指針
17.1.2 使用數組名常指針表示數組元素
17.1.3 指向數組元素的指針變數
17.1.4 指向數組的指針變數
17.1.5 指針數組
17.2 指針、結構體和結構體數組
17.2.1 兩種訪問形式
17.2.2 聲明創建一個結構數組
17.2.3 結構數組的初始化
17.2.4 結構數組的使用
17.2.5 指向結構數組的指針
17.3 函式指針
17.3.1 函式名指針
17.3.2 指向函式的指針
17.3.3 函式指針類型
17.3.4 函式指針做函式參數
17.3.5 函式指針數組
17.3.6 指向函式指針的指針
17.4 小結
17.5 上機實踐
第18章 更深入的理解—函式進階
18.1 參數傳遞的副本機制
18.1.1 傳值調用的副本機制
18.1.2 傳址調用的副本機制
18.2 函式返回值的副本機制
18.2.1 return局部變數為什麼合法
18.2.2 返回指針申請動態記憶體
18.2.3 不要返回指向棧記憶體的指針
18.2.4 返回指向唯讀存儲區的指針
18.3 函式與結構體
18.3.1 結構體變數的傳值和傳址調用
18.3.2 結構體變數的成員作為函式參數
18.3.3 返回結構體的函式
18.3.4 返回結構體指針的函式
18.4 函式與數組
18.4.1 數組元素作為函式參數
18.4.2 數組名作為函式參數
18.4.3 多維數組名作為函式參數
18.4.4 數組名作為函式參數時的退化
18.5 遞歸
18.5.1 遞歸流程
18.5.2 遞歸兩要素
18.5.3 效率與可讀性
18.6 帶參數的主函式
18.7 小結
18.8 上機實踐
第19章 生存期、作用域與可見域
19.1 記憶體分配
19.1.1 記憶體分區
19.1.2 變數的存儲類別
19.1.3 生存期
19.1.4 作用域與可見域
19.2 auto變數
19.2.1 定義格式
19.2.2 作用域和生存期
19.2.3 禁止
19.2.4 重複定義
19.2.5 初始化
19.3 register變數
19.3.1 定義格式
19.3.2 使用舉例
19.4 extern變數
19.4.1 全局變數定義
19.4.2 全局變數聲明
19.4.3 可見域
19.4.4 禁止
19.4.5 利與弊
19.5 static變數
19.5.1 定義格式
19.5.2 靜態局部變數
19.5.3 靜態全局變數
19.5.4 extern變數和static變數的初始化
19.6 函式的作用域與可見域
19.6.1 內部函式
19.6.2 外部函式
19.7 結構體定義的作用域與可見域
19.7.1 定義位置與可見域
19.7.2 允許重複定義
19.8 小結
19.9 上機實踐
第20章 編譯及預處理
20.1 編譯流程
20.1.1 編輯
20.1.2 預處理
20.1.3 編譯
20.1.4 連線
20.2 程式錯誤
20.2.1 錯誤分類
20.2.2 編譯錯誤
20.2.3 連線錯誤
20.2.4 邏輯錯誤
20.2.5 排錯
20.3 預處理命令之宏定義
20.3.1 宏定義
20.3.2 不帶參數的宏定義
20.3.3 帶參數的宏定義
20.3.4 #define定義常量與const常量
20.3.5 檔案包含
20.3.6 條件編譯
20.4 小結
20.5 上機實踐
第21章 數據結構
21.1 鍊表
21.1.1 鍊表的結構
21.1.2 創建鍊表並遍歷輸出
21.1.3 鍊表的插入
21.1.4 鍊表結點的刪除
21.1.5 鍊表的逆置
21.1.6 鍊表的銷毀
21.1.7 綜合實例
21.1.8 循環鍊表
21.1.9 雙鍊表
21.2 棧和佇列
21.2.1 棧的定義
21.2.2 棧的分類
21.2.3 棧的操作
21.2.4 函式與棧
21.2.5 佇列
21.3 小結
21.4 上機實踐
第四篇 C語言程式設計實例與面試題解析
第22章 C語言程式課程設計:遊戲
22.1 黑白棋
22.1.1 程式功能要求
22.1.2 輸入輸出樣例
22.1.3 程式分析
22.1.4 程式初始化
22.1.5 初始化圖形設備
22.1.6 繪製棋盤
22.1.7 交替繪製黑白棋
22.1.8 遊戲(同時判斷是否有一方勝利)
22.1.9 小結
22.2 五子棋
22.2.1 程式功能要求
22.2.2 輸入輸出樣例
22.2.3 程式分析
22.2.4 主函式程式設計
22.2.5 系統初始化
22.2.6 移動棋子模組
22.2.7 程式勝負判定
22.2.8 小結
22.3 掃雷遊戲
22.3.1 程式功能要求
22.3.2 輸入輸出樣例
22.3.3 程式分析
22.3.4 程式設計
22.3.5 初始化圖形設備
22.3.6 事件處理模組
22.3.7 遊戲處理部分
22.3.8 小結
22.4 速算24
22.4.1 程式功能要求
22.4.2 輸入輸出樣例
22.4.3 程式分析
22.4.4 程式設計
22.4.5 撲克牌處理部分
22.4.6 程式運算部分
22.4.7 小結
第23章 面試題解析
23.1 基礎知識
23.1.1 指針自增自減有什麼不同
23.1.2 什麼是遞歸
23.1.3 宏定義與操作符的區別
23.1.4 引用與值傳遞的區別
23.1.5 指針和引用有什麼區別
23.1.6 什麼是棧
23.1.7 main函式執行前還會執行什麼代碼
23.1.8 static有什麼用途
23.1.9 定義int **a[3][4], 則變數占用的記憶體空間為多少
23.1.10 什麼是預編譯
23.1.11 int (*s[10])(int)表示什麼意義
23.1.12 結構與聯合有何區別
23.2 算法和思維邏輯知識
23.2.1 100美元哪裡去了
23.2.2 將16升水平均分給四個人
23.2.3 算出小王買了幾瓶啤酒、幾瓶飲料
23.2.4 找出不同的蘋果
23.2.5 找出不同的球
23.2.6 猜自己的帽子顏色
23.2.7 三筐水果各是什麼
23.2.8 最後剩下的是誰
23.2.9 聰明的商人
23.2.10 紅球和白球
23.2.11 烏龜賽跑
23.2.12 投硬幣
附錄 ASCII編碼表