【轉(zhuǎn)載】C Primer Plus(第6版)中文版:轉(zhuǎn)載聲明與目錄
轉(zhuǎn)載聲明:寫在前面的話
個人還是建議購買實體書《C Primer Plus(第6版)中文版》來更好地學習C語言,這是我必須要說的話——一方面,由于是轉(zhuǎn)載,那么必然會與編者的意見有不可避免的出入,沒有了資金上的支持,未來的C語言教程編寫對他們而言會變得更加困難。而諸如C、C++、Python、Java這些匯編語言是計算機科學與技術(shù)的發(fā)展所不可缺失的中堅力量之一——另一方面,既然是轉(zhuǎn)載,那必然會存在與原作的閱讀體驗和感受存在明顯不同。你很難像在書上那樣圈畫批注,對于不擅長在計算機上學習的人來說,這種閱讀對學習的更是大打折扣,就仿佛一個長期生活在農(nóng)業(yè)地區(qū)的人突然一下子來到了畜牧地區(qū)的環(huán)境久居,難免會顯得水土不服。
這次轉(zhuǎn)載的目的是供愿意自學的人能夠減少更多非必要的時間來最快地學習C語言這門匯編程序,當然,還包括對實體書的一種宣傳。并不是所有人都有足夠的時間去圖書館花費精力尋找學習計算機的路線,更何況還有一些我們一向被忽視的人有著對學習計算機的愛好。我會盡量還原閱讀原作的效果,至少不會像直接復(fù)制過來那樣看著那么蹩腳。
總的說來,我還是希望來這里學習的各位在有條件的情況下購買原作來支持這些經(jīng)常疲憊于傳遞知識的工作者和花費生命為社會發(fā)展服務(wù)的譯者。我們的支持是他們維持興趣的最大動力,在此向他們表示崇高的敬意。
關(guān)于格式問題的更正說明(2024.1.14)
距離經(jīng)過轉(zhuǎn)載《C Primer Plus》已經(jīng)有了一個多月,有人反映關(guān)于專欄格式方面的問題。因為b站專欄的格式和書上與存在一些不同之處,且這些不同甚至影響到了程序代碼的調(diào)試結(jié)果的展示界面,不方便初學者理解。因此我改用書中原圖,借而替代一些文字部分構(gòu)成的代碼運行之后的界面。如果閱讀的時候發(fā)現(xiàn)了內(nèi)容或者格式的問題可以在評論區(qū)指正,我會在第一時間做出回饋。
目 錄

封面
扉頁
版權(quán)
內(nèi)容提要
作者簡介
前言
第1章 初識C語言
1.1 C語言的起源
1.2 選擇C語言的理由
1.2.1 設(shè)計特性
1.2.2 高效性
1.2.3 可移植性
1.2.4 強大而靈活
1.2.5 面向程序員
1.2.6 缺點
1.3 C語言的應(yīng)用范圍
1.4 計算機能做什么
1.5 高級計算機語言和編譯器
1.6 語言標準
1.6.1 第1個ANSI/ISO C標準
1.6.2 C99標準
1.6.3 C11標準
1.7 使用C語言的7個步驟
1.7.1 第1步:定義程序的目標
1.7.2 第2步:設(shè)計程序
1.7.3 第3步:編寫代碼
1.7.4 第4步:編譯
1.7.5 第5步:運行程序
1.7.6 第6步:測試和調(diào)試程序
1.7.7 第7步:維護和修改代碼
1.7.8 說明
1.8 編程機制
1.8.1 目標代碼文件、可執(zhí)行文件和庫
1.8.2 UNIX系統(tǒng)
1.8.3 GNU編譯器集合和LLVM項目
1.8.4 Linux系統(tǒng)
1.8.5 PC的命令行編譯器
1.8.6 集成開發(fā)環(huán)境(Windows)
1.8.7 Windows/Linux
1.8.8 Macintosh中的C
1.9 本書的組織結(jié)構(gòu)
1.10 本書的約定
1.10.1 字體
1.10.2 程序輸出
1.10.3 特殊元素
1.11 本章小結(jié)
1.12 復(fù)習題
1.13 編程練習
第2章 C語言概述
2.1 簡單的C程序示例
2.2 示例解釋
2.2.1 第1遍:快速概要
2.2.2 第2遍:程序細節(jié)
2.3 簡單程序的結(jié)構(gòu)
2.4 提高程序可讀性的技巧
2.5 進一步使用C
2.5.1 程序說明
2.5.2 多條聲明
2.5.3 乘法
2.5.4 打印多個值
2.6 多個函數(shù)
2.7 調(diào)試程序
2.7.1 語法錯誤
2.7.2 語義錯誤
2.7.3 程序狀態(tài)
2.8 關(guān)鍵字和保留標識符
2.9 關(guān)鍵概念
2.10 本章小結(jié)
2.11 復(fù)習題
2.12 編程練習
第3章 數(shù)據(jù)和C
3.1 示例程序
3.2 變量與常量數(shù)據(jù)
3.3 數(shù)據(jù):數(shù)據(jù)類型關(guān)鍵字
3.3.1 整數(shù)和浮點數(shù)
3.3.2 整數(shù)
3.3.3 浮點數(shù)
3.4 C語言基本數(shù)據(jù)類型
3.4.1 int類型
3.4.2 其他整數(shù)類型
3.4.3 使用字符:char類型
3.4.4 _Bool類型
3.4.5 可移植類型:stdint.h和inttypes.h
3.4.6 float、double和long double
3.4.7 復(fù)數(shù)和虛數(shù)類型
3.4.8 其他類型
3.4.9 類型大小
3.5 使用數(shù)據(jù)類型
3.6 參數(shù)和陷阱
3.7 轉(zhuǎn)義序列示例
3.7.1 程序運行情況
3.7.2 刷新輸出
3.8 關(guān)鍵概念
3.9 本章小結(jié)
3.10 復(fù)習題
3.11 編程練習
第4章 字符串和格式化輸入/輸出
4.1 前導(dǎo)程序
4.2 字符串簡介
4.2.1 char類型數(shù)組和null字符
4.2.2 使用字符串
4.2.3 strlen()函數(shù)
4.3 常量和C預(yù)處理器
4.3.1 const限定符
4.3.2 明示常量
4.4 printf()和scanf()
4.4.1 printf()函數(shù)
4.4.2 使用printf()
4.4.3 printf()的轉(zhuǎn)換說明修飾符
4.4.4 轉(zhuǎn)換說明的意義
4.4.5 使用scanf()
4.4.6 printf()和scanf()的*修飾符
4.4.7 printf()的用法提示
4.5 關(guān)鍵概念
4.6 本章小結(jié)
4.7 復(fù)習題
4.8 編程練習
第5章 運算符、表達式和語句
5.1 循環(huán)簡介
5.2 基本運算符
5.2.1 賦值運算符:=
5.2.2 加法運算符:+
5.2.3 減法運算符:-
5.2.4 符號運算符:-和+
5.2.5 乘法運算符:*
5.2.6 除法運算符:/
5.2.7 運算符優(yōu)先級
5.2.8 優(yōu)先級和求值順序
5.3 其他運算符
5.3.1 sizeof運算符和size_t類型
5.3.2 求模運算符:%
5.3.3 遞增運算符:++
5.3.4 遞減運算符:--
5.3.5 優(yōu)先級
5.3.6 不要自作聰明
5.4 表達式和語句
5.4.1 表達式
5.4.2 語句
5.4.3 復(fù)合語句(塊)
5.5 類型轉(zhuǎn)換
5.6 帶參數(shù)的函數(shù)
5.7 示例程序
5.8 關(guān)鍵概念
5.9 本章小結(jié)
5.10 復(fù)習題
5.11 編程練習
第6章 C控制語句:循環(huán)
6.1 再探while循環(huán)
6.1.1 程序注釋
6.1.2 C風格讀取循環(huán)
6.2 while語句
6.2.1 終止while循環(huán)
6.2.2 何時終止循環(huán)
6.2.3 while:入口條件循環(huán)
6.2.4 語法要點
6.3 用關(guān)系運算符和表達式比較大小
6.3.1 什么是真
6.3.2 其他真值
6.3.3 真值的問題
6.3.4 新的_Bool類型
6.3.5 優(yōu)先級和關(guān)系運算符
6.4 不確定循環(huán)和計數(shù)循環(huán)
6.5 for循環(huán)
6.6 其他賦值運算符:+=、-=、*=、/=、%=
6.7 逗號運算符
6.8 出口條件循環(huán):do while
6.9 如何選擇循環(huán)
6.10 嵌套循環(huán)
6.10.1 程序分析
6.10.2 嵌套變式
6.11 數(shù)組簡介
6.12 使用函數(shù)返回值的循環(huán)示例
6.12.1 程序分析
6.12.2 使用帶返回值的函數(shù)
6.13 關(guān)鍵概念
6.14 本章小結(jié)
6.15 復(fù)習題
6.16 編程練習
第7章 C控制語句:分支和跳轉(zhuǎn)
7.1 if語句
7.2 if else語句
7.2.1 另一個示例:介紹getchar()和putchar()
7.2.2 ctype.h系列的字符函數(shù)
7.2.3 多重選擇else if
7.2.4 else與if配對
7.2.5 多層嵌套的if語句
7.3 邏輯運算符
7.3.1 備選拼寫:iso646.h頭文件
7.3.2 優(yōu)先級
7.3.3 求值順序
7.3.4 范圍
7.4 一個統(tǒng)計單詞的程序
7.5 條件運算符:?:
7.6 循環(huán)輔助:continue和break
7.6.1 continue語句
7.6.2 break語句
7.7 多重選擇:switch和break
7.7.1 switch語句
7.7.2 只讀每行的首字符
7.7.3 多重標簽
7.7.4 switch和if else
7.8 goto語句
7.9 關(guān)鍵概念
7.10 本章小結(jié)
7.11 復(fù)習題
7.12 編程練習
第8章 字符輸入/輸出和輸入驗證
8.1 單字符I/O:getchar()和putchar()
8.2 緩沖區(qū)
8.3 結(jié)束鍵盤輸入
8.3.1 文件、流和鍵盤輸入
8.3.2 文件結(jié)尾
8.4 重定向和文件
8.5 創(chuàng)建更友好的用戶界面
8.5.1 使用緩沖輸入
8.5.2 混合數(shù)值和字符輸入
8.6 輸入驗證
8.6.1 分析程序
8.6.2 輸入流和數(shù)字
8.7 菜單瀏覽
8.7.1 任務(wù)
8.7.2 使執(zhí)行更順利
8.7.3 混合字符和數(shù)值輸入
8.8 關(guān)鍵概念
8.9 本章小結(jié)
8.10 復(fù)習題
8.11 編程練習
第9章 函數(shù)
9.1 復(fù)習函數(shù)
9.1.1 創(chuàng)建并使用簡單函數(shù)
9.1.2 分析程序
9.1.3 函數(shù)參數(shù)
9.1.4 定義帶形式參數(shù)的函數(shù)
9.1.5 聲明帶形式參數(shù)函數(shù)的原型
9.1.6 調(diào)用帶實際參數(shù)的函數(shù)
9.1.7 黑盒視角
9.1.8 使用return從函數(shù)中返回值
9.1.9 函數(shù)類型
9.2 ANSI C函數(shù)原型
9.2.1 問題所在
9.2.2 ANSI的解決方案
9.2.3 無參數(shù)和未指定參數(shù)
9.2.4 函數(shù)原型的優(yōu)點
9.3 遞歸
9.3.1 演示遞歸
9.3.2 遞歸的基本原理
9.3.3 尾遞歸
9.3.4 遞歸和倒序計算
9.3.5 遞歸的優(yōu)缺點
9.4 編譯多源代碼文件的程序
9.4.1 UNIX
9.4.2 Linux
9.4.3 DOS命令行編譯器
9.4.4 Windows和蘋果的IDE編譯器
9.4.5 使用頭文件
9.5 查找地址:&運算符
9.6 更改主調(diào)函數(shù)中的變量
9.7 指針簡介
9.7.1 間接運算符:*
9.7.2 聲明指針
9.7.3 使用指針在函數(shù)間通信
9.8 關(guān)鍵概念
9.9 本章小結(jié)
9.10 復(fù)習題
9.11 編程練習
第10章 數(shù)組和指針
10.1 數(shù)組
10.1.1 初始化數(shù)組
10.1.2 指定初始化器(C99)
10.1.3 給數(shù)組元素賦值
10.1.4 數(shù)組邊界
10.1.5 指定數(shù)組的大小
10.2 多維數(shù)組
10.2.1 初始化二維數(shù)組
10.2.2 其他多維數(shù)組
10.3 指針和數(shù)組
10.4 函數(shù)、數(shù)組和指針
10.4.1 使用指針形參
10.4.2 指針表示法和數(shù)組表示法
10.5 指針操作
10.6 保護數(shù)組中的數(shù)據(jù)
10.6.1 對形式參數(shù)使用const
10.6.2 const的其他內(nèi)容
10.7 指針和多維數(shù)組
10.7.1 指向多維數(shù)組的指針
10.7.2 指針的兼容性
10.7.3 函數(shù)和多維數(shù)組
10.8 變長數(shù)組(VLA)
10.9 復(fù)合字面量
10.10 關(guān)鍵概念
10.11 本章小結(jié)
10.12 復(fù)習題
10.13 編程練習
第11章 字符串和字符串函數(shù)
11.1 表示字符串和字符串I/O
11.1.1 在程序中定義字符串
11.1.2 指針和字符串
11.2 字符串輸入
11.2.1 分配空間
11.2.2 不幸的gets()函數(shù)
11.2.3 gets()的替代品
11.2.4 scanf()函數(shù)
11.3 字符串輸出
11.3.1 puts()函數(shù)
11.3.2 fputs()函數(shù)
11.3.3 printf()函數(shù)
11.4 自定義輸入/輸出函數(shù)
11.5 字符串函數(shù)
11.5.1 strlen()函數(shù)
11.5.2 strcat()函數(shù)
11.5.3 strncat()函數(shù)
11.5.4 strcmp()函數(shù)
11.5.5 strcpy()和strncpy()函數(shù)
11.5.6 sprintf()函數(shù)
11.5.7 其他字符串函數(shù)
11.6 字符串示例:字符串排序
11.6.1 排序指針而非字符串
11.6.2 選擇排序算法
11.7 ctype.h字符函數(shù)和字符串
11.8 命令行參數(shù)
11.8.1 集成環(huán)境中的命令行參數(shù)
11.8.2 Macintosh中的命令行參數(shù)
11.9 把字符串轉(zhuǎn)換為數(shù)字
11.10 關(guān)鍵概念
11.11 本章小結(jié)
11.12 復(fù)習題
11.13 編程練習
第12章 存儲類別、鏈接和內(nèi)存管理
12.1 存儲類別
12.1.1 作用域
12.1.2 鏈接
12.1.3 存儲期
12.1.4 自動變量
12.1.5 寄存器變量
12.1.6 塊作用域的靜態(tài)變量
12.1.7 外部鏈接的靜態(tài)變量
12.1.8 內(nèi)部鏈接的靜態(tài)變量
12.1.9 多文件
12.1.10 存儲類別說明符
12.1.11 存儲類別和函數(shù)
12.1.12 存儲類別的選擇
12.2 隨機數(shù)函數(shù)和靜態(tài)變量
12.3 擲骰子
12.4 分配內(nèi)存:malloc()和free()
12.4.1 free()的重要性
12.4.2 calloc()函數(shù)
12.4.3 動態(tài)內(nèi)存分配和變長數(shù)組
12.4.4 存儲類別和動態(tài)內(nèi)存分配
12.5 ANSI C類型限定符
12.5.1 const類型限定符
12.5.2 volatile類型限定符
12.5.3 restrict類型限定符
12.5.4 _Atomic類型限定符(C11)
12.5.5 舊關(guān)鍵字的新位置
12.6 關(guān)鍵概念
12.7 本章小結(jié)
12.8 復(fù)習題
12.9 編程練習
第13章 文件輸入/輸出
13.1 與文件進行通信
13.1.1 文件是什么
13.1.2 文本模式和二進制模式
13.1.3 I/O的級別
13.1.4 標準文件
13.2 標準I/O
13.2.1 檢查命令行參數(shù)
13.2.2 fopen()函數(shù)
13.2.3 getc()和putc()函數(shù)
13.2.4 文件結(jié)尾
13.2.5 fclose()函數(shù)
13.2.6 指向標準文件的指針
13.3 一個簡單的文件壓縮程序
13.4 文件I/O:fprintf()、fscanf()、fgets()和fputs()
13.4.1 fprintf()和fscanf()函數(shù)
13.4.2 fgets()和fputs()函數(shù)
13.5 隨機訪問:fseek()和ftell()
13.5.1 fseek()和ftell()的工作原理
13.5.2 二進制模式和文本模式
13.5.3 可移植性
13.5.4 fgetpos()和fsetpos()函數(shù)
13.6 標準I/O的機理
13.7 其他標準I/O函數(shù)
13.7.1 int ungetc(int c, FILE *fp)函數(shù)
13.7.2 int fflush()函數(shù)
13.7.3 int setvbuf()函數(shù)
13.7.4 二進制I/O:fread()和fwrite()
13.7.5 size_t fwrite()函數(shù)
13.7.6 size_t fread()函數(shù)
13.7.7 int feof(FILE *fp)和int ferror(FILE *fp)函數(shù)
13.7.8 一個程序示例
13.7.9 用二進制I/O進行隨機訪問
13.8 關(guān)鍵概念
13.9 本章小結(jié)
13.10 復(fù)習題
13.11 編程練習
第14章 結(jié)構(gòu)和其他數(shù)據(jù)形式
14.1 示例問題:創(chuàng)建圖書目錄
14.2 建立結(jié)構(gòu)聲明
14.3 定義結(jié)構(gòu)變量
14.3.1 初始化結(jié)構(gòu)
14.3.2 訪問結(jié)構(gòu)成員
14.3.3 結(jié)構(gòu)的初始化器
14.4 結(jié)構(gòu)數(shù)組
14.4.1 聲明結(jié)構(gòu)數(shù)組
14.4.2 標識結(jié)構(gòu)數(shù)組的成員
14.4.3 程序討論
14.5 嵌套結(jié)構(gòu)
14.6 指向結(jié)構(gòu)的指針
14.6.1 聲明和初始化結(jié)構(gòu)指針
14.6.2 用指針訪問成員
14.7 向函數(shù)傳遞結(jié)構(gòu)的信息
14.7.1 傳遞結(jié)構(gòu)成員
14.7.2 傳遞結(jié)構(gòu)的地址
14.7.3 傳遞結(jié)構(gòu)
14.7.4 其他結(jié)構(gòu)特性
14.7.5 結(jié)構(gòu)和結(jié)構(gòu)指針的選擇
14.7.6 結(jié)構(gòu)中的字符數(shù)組和字符指針
14.7.7 結(jié)構(gòu)、指針和malloc()
14.7.8 復(fù)合字面量和結(jié)構(gòu)(C99)
14.7.9 伸縮型數(shù)組成員(C99)
14.7.10 匿名結(jié)構(gòu)(C11)
14.7.11 使用結(jié)構(gòu)數(shù)組的函數(shù)
14.8 把結(jié)構(gòu)內(nèi)容保存到文件中
14.8.1 保存結(jié)構(gòu)的程序示例
14.8.2 程序要點
14.9 鏈式結(jié)構(gòu)
14.10 聯(lián)合簡介
14.10.1 使用聯(lián)合
14.10.2 匿名聯(lián)合(C11)
14.11 枚舉類型
14.11.1 enum常量
14.11.2 默認值
14.11.3 賦值
14.11.4 enum的用法
14.11.5 共享名稱空間
14.12 typedef簡介
14.13 其他復(fù)雜的聲明
14.14 函數(shù)和指針
14.15 關(guān)鍵概念
14.16 本章小結(jié)
14.17 復(fù)習題
14.18 編程練習
第15章 位操作
15.1 二進制數(shù)、位和字節(jié)
15.1.1 二進制整數(shù)
15.1.2 有符號整數(shù)
15.1.3 二進制浮點數(shù)
15.2 其他進制數(shù)
15.2.1 八進制
15.2.2 十六進制
15.3 C按位運算符
15.3.1 按位邏輯運算符
15.3.2 用法:掩碼
15.3.3 用法:打開位(設(shè)置位)
15.3.4 用法:關(guān)閉位(清空位)
15.3.5 用法:切換位
15.3.6 用法:檢查位的值
15.3.7 移位運算符
15.3.8 編程示例
15.3.9 另一個例子
15.4 位字段
15.4.1 位字段示例
15.4.2 位字段和按位運算符
15.5 對齊特性(C11)
15.6 關(guān)鍵概念
15.7 本章小結(jié)
15.8 復(fù)習題
15.9 編程練習
第16章 C預(yù)處理器和C庫
16.1 翻譯程序的第一步
16.2 明示常量:#define
16.2.1 記號
16.2.2 重定義常量
16.3 在#define中使用參數(shù)
16.3.1 用宏參數(shù)創(chuàng)建字符串:#運算符
16.3.2 預(yù)處理器黏合劑:##運算符
16.3.3 變參宏:...和_ _VA_ARGS_ _
16.4 宏和函數(shù)的選擇
16.5 文件包含:#include
16.5.1 頭文件示例
16.5.2 使用頭文件
16.6 其他指令
16.6.1 #undef指令
16.6.2 從C預(yù)處理器角度看已定義
16.6.3 條件編譯
16.6.4 預(yù)定義宏
16.6.5 #line和#error
16.6.6 #pragma
16.6.7 泛型選擇(C11)
16.7 內(nèi)聯(lián)函數(shù)(C99)
16.8 _Noreturn函數(shù)(C11)
16.9 C庫
16.9.1 訪問C庫
16.9.2 使用庫描述
16.10 數(shù)學庫
16.10.1 三角問題
16.10.2 類型變體
16.10.3 tgmath.h庫(C99)
16.11 通用工具庫
16.11.1 exit()和atexit()函數(shù)
16.11.2 qsort()函數(shù)
16.12 斷言庫
16.12.1 assert的用法
16.12.2 _Static_assert(C11)
16.13 string.h庫中的memcpy()和memmove()
16.14 可變參數(shù):stdarg.h
16.15 關(guān)鍵概念
16.16 本章小結(jié)
16.17 復(fù)習題
16.18 編程練習
第17章高級數(shù)據(jù)表示
17.1 研究數(shù)據(jù)表示
17.2 從數(shù)組到鏈表
17.2.1 使用鏈表
17.2.2 反思
17.3 抽象數(shù)據(jù)類型(ADT)
17.3.1 建立抽象
17.3.2 建立接口
17.3.3 使用接口
17.3.4 實現(xiàn)接口
17.4 隊列ADT
17.4.1 定義隊列抽象數(shù)據(jù)類型
17.4.2 定義一個接口
17.4.3 實現(xiàn)接口數(shù)據(jù)表示
17.4.4 測試隊列
17.5 用隊列進行模擬
17.6 鏈表和數(shù)組
17.7 二叉查找樹
17.7.1 二叉樹ADT
17.7.2 二叉查找樹接口
17.7.3 二叉樹的實現(xiàn)
17.7.4 使用二叉樹
17.7.5 樹的思想
17.8 其他說明
17.9 關(guān)鍵概念
17.10 本章小結(jié)
17.11 復(fù)習題
17.12 編程練習
附錄A 復(fù)習題答案
附錄B 參考資料
B.1 參考資料I:補充閱讀
B.2 參考資料II:C運算符
B.3 參考資料III:基本類型和存儲類別
B.4 參考資料IV:表達式、語句和程序流
B.5 參考資料V:新增C99和C11的ANSI C庫
B.6 參考資料VI:擴展的整數(shù)類型
B.7 參考資料VII:擴展字符支持
B.8 參考資料VIII:C99/C11數(shù)值計算增強
B.9 參考資料IX:C和C++的區(qū)別