C/C++从入门到高手所有必备PDF书籍

本文汇总了一系列C和C++语言的经典学习资料链接,包括《C程序设计语言》、《Effective C++》等著名书籍的PDF版,适合各阶段学习者深入掌握这两种重要编程语言。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《C和指针》- PDF高清版
下载地址:http://www.fishc.com/a/book/C/821.html

《C程序设计语言》- 完美中文版PDF
下载地址:http://www.fishc.com/a/book/C/632.html

《The C Programming Language》- 英文原版
下载地址:http://www.fishc.com/a/book/C/115.html

《C的缺陷与陷阱》- PDF高清版
下载地址:http://www.fishc.com/a/book/C/266.html

《你必须知道的495个C语言问题》- 完美PDF
下载地址:http://www.fishc.com/a/book/C/342.html

《C专家编程》- 高清版PDF - 中英文全
下载地址:http://www.fishc.com/a/book/C/114.html

《C程序设计100例题》- 完美版PDF
下载地址:http://www.fishc.com/a/book/C/112.html

《C程序设计》- 入门必备,谭浩强的。
下载地址:http://www.fishc.com/a/book/C/111.html

《linux操作系统下c语言编程入门》- PDF完美版
下载地址:http://www.fishc.com/a/book/C/673.html

《编程精粹 - Microsoft编写优质无错C程序秘诀》- WORD完美版
下载地址:http://www.fishc.com/a/book/C/607.html

《C语言深度剖析》- PDF完美版
下载地址:http://www.fishc.com/a/book/C/467.html

《C语言函数语法大全》- CHM版,方便大家查找的小手册
下载地址:http://www.fishc.com/a/book/C/466.html


C++:


《C++程序设计》- 谭浩强 - PDF完美版
下载地址:http://www.fishc.com/a/book/C__/734.html

《Effective C++》- 完美中文版PDF
下载地址:http://www.fishc.com/a/book/C__/674.html

《More Effective C++》- 完美中文版PDF
下载地址:http://www.fishc.com/a/book/C__/616.html

《C++ Primer 中文版(完美版) + 英文版(完美版) + 题解 + 源代码》- 经典中的经典!!
下载地址:http://www.fishc.com/a/book/C__/517.html

《C++编程思想》- 完美版PDF
下载地址:http://www.fishc.com/a/book/C__/560.html

《高质量C++/C编程指南》- 完美版PDF
下载地址:http://www.fishc.com/a/book/C__/648.html

《Effective C++ CD》- 英文原版PDF
下载地址:http://www.fishc.com/a/book/C__/561.html

《C++Builder问题解答大全》- 合集
下载地址:http://www.fishc.com/a/book/C__/562.html

《ISO C99》- 英文原版PDF
下载地址:http://www.fishc.com/a/book/C__/465.html

《C++沉思录》- 高清版PDF
下载地址:http://www.fishc.com/a/book/C/675.html

下載網址: 從新手到高手C++_程式碼.rar http://fp.io/3355b224 從新手到高手C++_書籍PDF.rar http://fp.io/a8ba9fd4 從新手到高手C++_視頻教學.part1.rar http://fp.io/13f997fa 從新手到高手C++_視頻教學.part2.rar http://fp.io/b2c1a7bf 中文名: 從新手到高手C++全方位學習隨書DVD文件 作者: 範磊 出版社: 科學出版社 書號: 703024706X 發行時間: 2009年09月 地區: 大陸 語言: 簡體中文 簡介: 內容簡介 《從新手到高手C++全方位學習》總結了十幾本C++圖書及教材的優點,擯棄了它們語言拖沓、層次結構混亂等缺陷,從零開始、由淺入深、層層遞進、細緻而又詳盡地講解C++這門大型編程語言。 《從新手到高手C++全方位學習》知識系統全面,擁有字典般的容量,可隨用隨查,涵蓋指針、面向對象、操作符重載、流、命名空問、模板、異常處理、宏等主流C++開發技術。為了使讀者能夠活學活用,《從新手到高手C++全方位學習》針對重要的概念精心設計了438個實用範例,囊括大量經驗和技巧,即使已從事C++工作多年的朋友,也能從中汲取新的養料。 《從新手到高手C++全方位學習》適合於從未學習過任何編程語言的新手,以及學習C++多年,仍舊不能融會貫通的讀者,對於正在使用C++進行開發的程序員也有很好的參考價值。 光盤提供的視頻教程,包含了第1章到第17章的內容,網上有18、19章的教程,這個光盤沒有包括。 視頻教程目錄的截圖: 源代碼目錄的截圖 從新手到高手C++目錄: 第1章 初識C++ 1.1 C++簡介 1.2 C++與C的區別 1.3 學習C++之前需要先學C嗎 1.4 C++與其他語言的區別 1.5 C++的版本以及安裝問題 第2章 做一個最簡短的C++程序 2.1 簡單的屏幕輸出小程序 2.2 輸出語句的使用 2.3 std::介紹 2.4 iostream與iostream.h的區別 2.5 重名問題 2.6 註釋 第3章 初步了解函數 3.1 一個簡單的函數 3.2 函數的傳參 3.3 函數的返回值. 參數與變量 3.4 函數的聲明與定義 3.5 局部變量 3.6 全局變量 第4章 C++數據類型 4.1 變量的定義 4.2 將變量及數據存儲在內存中 4.3 布爾型變量 4.4 字符型變量 4.5 wchar_t雙字節型變量 4.6 整型概述 4.7 整型變量的定義 4.8 浮點型變量 4.9 常量 4.10 枚舉型常量 第5章 if語句與邏輯運算符 5.1 語句的定義 5.2 塊的定義 5.3 表達式的定義 5.4 運算符的定義 5.4.1 賦值運算符的定義 5.4.2 數學運算符的定義 5.4.3 賦值運算符與數學運算符的聯合 5.5 自加與自減 5.5.1 前置 5.5.2 後置 5.6 表達式的優先級 5.7 關係運算符 5.8 if語句 5.8.1 else語句 5.8.2 else if語句 5.8.3 if語句的嵌套 5.9 邏輯運算符及其使用 5.9.1 邏輯“與” 5.9.2 邏輯“或” 5.9.3 邏輯“非” 5.9.4 邏輯運算符的優先級 5.9.5 運算式的真假關係 5.10 三目運算符 5.10.1 三目運算符的優先問題 5.10.2 三目運算符的使用問題 5.10.3 三目運算符的型別問題 5.10.4 三目運算符在字符型變量中的使用 5.11 複雜嵌套的if語句 第6章 面向對象 6.1 面向對象程序語言的主要特徵 6.2 類. 對象和成員 6.3 類. 對象和成員的使用方法及區別 6.3.1 聲明一個類 6.3.2 命名習慣 6.3.3 定義一個對象 6.3.4 類與對象的區別 6.3.5 對象與成員的關係 6.3.6 不要給類賦值 6.3.7 對像只能調用類中存在的成員 6.4 公有 6.5 私有 6.6 成員函數的聲明和定義 6.7 為什麼將成員函數的聲明和定義分開 6.7.1 普通內聯函數 6.7.2 成員內聯函數 6.8 將類聲明和定義部分保存在頭文件中 6.9 const成員函數 6.10 構造函數 6.11 默認構造函數 6.12 析構函數 6.13 析構對像數組 第7章 循環語句 7.1 循環語句的前身——goto語句 7.2 慎用goto語句 7.3 while語句 7.3.1 帶運算符的while語句 7.3.2 以字符為條件的while語句 7.3.3 限定while循環的次數 7.3.4 continue語句 7.3.5 break語句 7.3.6 永不休止的while循環 7.4 do… while循環 7.5 for循環 7.5.1 靈活的for循環 7.5.2 條件為空的for循環 7.5.3 執行為空的for循環 7.5.4 嵌套的for循環 7.6 switch語句 7.6.1 switch語句常見錯誤 7.6.2 switch的菜單功能 7.7 總結 第8章 指針 8.1 什麼是地址 8.2 用指針來保存地址 8.2.1 空指針 8.2.2 指針與變量類型 8.2.3 用指針來訪問值 8.2.4 指針地址. 指針保存的地址和該地址的值 8.2.5 指針對數值的操作 8.2.6 更換指針保存的地址 8.3 為什麼使用指針 8.3.1 棧和堆 8.3.2 用指針創建堆中空間 8.3.3 用指針刪除堆中空間 8.4 動態內存 8.4.1 內存洩漏 8.4.2 在堆中創建對象 8.4.3 在堆中刪除對象 8.4.4 訪問堆中的數據成員 8.4.5 在構造函數中開闢內存空間 8.4.6 對像在棧與堆中的不同 8.5 this指針 8.6 指針的常見錯誤 8.7 指針運算 8.7.1 指針的加減運算 8.7.2 指針的賦值運算 8.7.3 指針的相減運算 8.7.4 指針的比較運算 8.8 指針 8.8.1 常量指針 8.8.2 指向常量的指針 8.8.3 指向常量的常指針 8.9 總結 第9章 引用 9.1 什麼是引用 9.1.1 引用的地址 9.1.2 引用就是別名常量 9.1.3 引用對象 9.1.4 空引用 9.2 函數的參數傳遞 9.2.1 通過值來傳遞函數參數 9.2.2 通過指針來傳遞函數參數 9.2.3 通過引用來傳遞函數參數 9.2.4 讓函數返回多個值 9.3 傳遞對象 9.3.1 用值來傳遞對象 9.3.2 使用指針來傳遞對象 9.3.3 使用const指針來傳遞對象 9.3.4 使用引用來傳遞對象 9.3.5 到底是使用引用還是指針 9.3.6 引用和指針可以一塊用 9.4 引用應注意的問題 9.4.1 引用容易犯的錯誤 9.4.2 引用一個按值返回的堆中對象 9.4.3 引用一個按別名返回的堆中對象 9.4.4 在哪裡創建,就在哪裡釋放 9.5 總結 第10章 深入函數 10.1 函數重載 10.1.1 普通函數的重載 10.1.2 成員函數的重載 10.2 函數的默認參數 10.3 重載構造函數 10.3.1 成員變量的初始化 10.3.2 成員變量的初始化與構造函數 10.3.3 複製構造函數 10.3.4 構造函數和new運算符 10.3.5 再談默認構造函數 10.4 析構函數和delete運算符 10.4.1 默認析構函數 10.4.2 調用構造函數進行類型轉換 10.5 淺層複製構造函數 10.6 深層複製構造函數 第11章 運算符重載 11.1 運算符重載 11.2 在成員函數中實現自加 11.3 重載前置自加運算符 11.4 創建臨時對象 11.5 創建無名臨時對象 11.6 取消創建臨時對象 11.7 重載後置自加運算符 11.8 重載加法運算函數operator+ 11.9 重載賦值運算函數operator= 11.10 轉換類型運算符 11.10.1 溫習調用構造函數實現的類型轉換 11.10.2 通過構造函數將變量轉換為一個對象的成員變量 11.10.3 通過operator關鍵字進行轉換 11.11 什麼可以被重載,什麼不可以 第12章 繼承 12.1 什麼是繼承和派生 12.1.1 複雜的繼承和派生 12.1.2 繼承和派生如何在C++中實現 12.1.3 繼承的種類及語法 12.1.4 單一繼承 12.2 公有型. 保護型和私有型 12.3 訪問權限 12.4 多重繼承 12.5 繼承的構造與析構 12.6 向基類構造函數傳遞參數 12.7 繼承和重載的兩義性問題 12.7.1 多重繼承容易產生兩義性 12.7.2 兩義性在重載時的一些問題 12.7.3 兩義性的歸屬問題 12.7.4 減少兩義性產生的混淆問題 12.7.5 虛基類不會產生兩義性 12.8 總結 第13章 虛函數 13.1 指向對象的指針 13.2 虛函數 13.3 拳擊遊戲 13.4 繼承是否可以實現多態性 13.5 在編譯時的靜態聯編 13.6 在運行時的靜態聯編 13.7 在編譯時的動態聯編 13.8 在運行時的動態聯編 13.9 調用虛函數 13.9.1 在虛函數中調用成員函數 13.9.2 三種調用虛函數的方式比較 13.10 被繼承的虛函數仍然是虛函數 13.11 系統是如何調用虛函數的 13.12 在虛函數中使用成員名限定 13.13 虛析構函數 第14章 數組 14.1 數組的基本用法 14.1.1 什麼是數組 14.1.2 數組元素 14.1.3 數組下標越界 14.1.4 倒序輸出 14.1.5 將數組的下標定義為常量 14.1.6 手動操作數組元素 14.1.7 數組的初始化 14.2 數組的用途 14.2.1 求平均考試成績 14.2.2 兔子繁殖問題 14.2.3 數字排序問題 14.3 數組在內存中的分佈 14.4 輸出數組名 14.5 數組名與函數 14.6 傳遞與接收 14.7 數組與函數 14.7.1 函數傳參實例一——求數組所有元素的和 14.7.2 函數傳參實例二——用遞增法查找數據 14.7.3 函數傳參實例三——用二分法查找數據 14.7.4 函數傳參實例四——判斷數組是否按照順序排列 14.7.5 函數傳參實例五——判斷數組排列方式後執行不同的函數 14.8 數組在對像中的傳參 14.9 數組對象 14.10 在數組對像中初始化成員變量 14.11 指針數組 14.12 枚舉常量與數組.. 14.13 多維數組 14.14 多維數組的初始化 14.15 字符數組 14.16 重載數組下標操作符 第15章 鍊錶 15.1 聲明鍊錶結構 15.2 簡單的圖書鍊錶 15.2.1 圖書鍊錶 15.2.2 類的鍊錶 15.3 動態鍊錶 15.3.1 動態鍊錶的建立 15.3.2 解決輸入字符造成死循環的問題 15.3.3 動態鍊錶的顯示 15.3.4 動態鍊錶的刪除 15.3.5 動態鍊錶的插入 15.3.6 鍊錶統計 15.3.7 使用鍊錶 15.4 完整的動態鍊錶清單 15.5 鍊錶使用案例——走迷宮 15.5.1 創建Windows應用程序項目 15.5.2 創建窗口 15.5.3 加載圖片 15.5.4 句柄是什麼 15.5.5 顯示圖片 15.5.6 動畫 15.5.7 鍵盤控制人物移動 15.5.8 迷宮牆壁 15.5.9 走迷宮 15.5.10 用鍊錶記錄行走路線 第16章 多態性 16.1 為什麼要使用多重繼承 16.2 在派生類中增加函數 16.3 使用多重繼承 16.4 多重繼承中初始化構造函數的參數 16.5 多個子基類共享一個父基類 16.6 虛基類 16.7 慎用多重繼承 16.8 空的虛函數 16.9 抽像類和純虛函數 16.10 純虛函數 16.11 複雜的抽象結構 第17章 類的特殊成員 17.1 靜態成員變量 17.2 私有靜態成員變量 17.3 靜態成員函數 17.4 靜態成員的使用 17.5 函數指針 17.6 函數指針數組 17.7 函數指針也可以作為函數的參數 17.8 使用typedef簡化函數指針的聲明及定義 17.9 類的函數指針 17.10 成員函數指針數組 第18章 字符串 18.1 char型字符串 18.2 string型字符串 18.2.1 string型字符串的賦值 18.2.2 string型字符串的合併 18.2.3 string型字符串的部分合併 18.2.4 string型字符串的替換 18.2.5 string型字符串的複制 18.2.6 string型字符串的插入 18.2.7 string型字符串的刪除 18.2.8 string型字符串的查找 18.2.9 string型字符串的比較 18.2.10 判斷string型字符串是否為空 18.3 字符串的使用 18.3.1 swap() 交換兩個字符串的內容 18.3.2 將string型字符串轉為char型字符串 18.3.3 char型字符串與函數 18.3.4 函數如何返回字符串 18.4 結構體 18.4.1 結構體的賦值 18.4.2 結構體與函數 18.4.3 結構體與string 18.5 string數組與函數 18.6 流的使用 18.6.1 重載輸出運算符<< 18.6.2 友元的方式重載輸出運算符 18.6.3 重載自加運算符的執行次序 18.6.4 重載輸入運算符>> 18.7 編寫一個String類 18.7.1 創建String類 18.7.2 創建可自動調節大小的String類字符串對象 18.7.3 限制數組越界 18.7.4 用複制構造函數實現字符串的賦值功能 18.7.5 用重載賦值運算符函數實現真正的字符串賦值功能 18.7.6 用重載輸出運算符operator<<()函數實現字符串的輸出 18.7.7 用重載輸入運算符operator>>()函數實現字符串的輸入 18.7.8 用重載比較運算符實現字符串的比較 18.7.9 為String類添加字符串的相加功能 18.7.10 為String類添加字符串的+=功能 18.7.11 完成後的String類 第19章 代碼重用 19.1 包含 19.2 將String類作為包含類 19.3 為book類重載執行相加運算的成員函數 19.4 包含對系統造成的消耗 19.5 按別名傳遞book對象 19.6 包含指向另一個類的指針 19.6.1 數據類Date 19.6.2 鍊錶類Node 19.6.3 標籤類linkelist 19.6.4 頭節點類HeadNode 19.6.5 尾節點TailNode類 19.6.6 中間節點InterNode類 19.6.7 InterNode類的構造函數 19.6.8 InterNode類的插入函數 19.6.9 全部程序 19.7 將頭節點. 中間節點和尾節點合併為一個節點 19.7.1 數據類Date 19.7.2 由Date類派生的圖書類Book 19.7.3 由Date類派生的藥品類medica 19.7.4 創建一個節點類Node 19.7.5 用來操作節點類Node的list類 19.7.6 list類的getfirst()方法 19.7.7 list類的operator[]方法 19.7.8 list類的repeat()方法 19.7.9 list類的insert()方法 19.7.10 list類的find()方法 19.7.11 重寫的藥品管理全部程序 19.8 利用類的包含來實現代碼重用 19.9 私有繼承 19.10 什麼時候使用私有繼承,什麼時候使用包含 19.11 保護繼承 第20章 友元類與嵌套類 20.1 友元類 20.2 嵌套類 第21章 流 21.1 流的操作 21.1.1 緩衝 21.1.2 流和緩衝區 21.1.3 標準輸入輸出對象 21.1.4 重定向 21.1.5 對象代表流 21.2 用cout輸出 21.2.1 重載運算符operator<< 21.2.2 清理緩衝區 21.2.3 有關輸出的相關函數 21.2.4 設置輸出的字段寬度 21.2.5 設置填充字段 21.2.6 設置浮點數的顯示精度 21.2.7 輸出末尾的0 21.2.8 設置標誌 21.2.9 setf()函數原型 21.2.10 所有15個標誌以及3個指示標誌 21.2.11 unset()函數 21.2.12 標準控制符 21.2.13 iomanip頭文件與標準控制符 21.3 用cin輸入 21.3.1 字符串的輸入 21.3.2 字符串的輸入問題 21.3.3 get()函數 21.3.4 帶字符引用參數的get()函數 21.3.5 帶2個參數的get()函數 21.3.6 帶3個參數的get()函數 21.3.7 getline()函數 21.3.8 read()函數 21.3.9 gcount()函數 21.3.10 peek()函數 21.3.11 putback()函數 21.4 文件的輸入和輸出 21.4.1 輸出數據到文件 21.4.2 讀取文件中的數據 21.4.3 讀取空格及空格後面的字符 21.5 多種打開文件的方式 21.6 檢查文件是否打開 21.7 二進製文件和文本文件 21.7.1 以文本形式輸出到文件 21.7.2 以二進制形式輸出到文件 21.8 打開多個文件 21.9 命令行處理文件 21.10 使用命令行處理文件例程 21.11 指定讀取文件中的數據 21.12 輸出數據到文件指定位置處 21.13 seekp()和seekg()函數的結合使用 21.14 臨時文件 21.15 sstream字符串輸入輸出流類 第22章 命名空間 22.1 什麼是命名空間 22.2 創建命名空間 22.2.1 擴充命名空間的內容 22.2.2 盡量在命名空間之外定義函數 22.2.3 命名空間中的成員都是公有的 22.3 使用命名空間 22.4 使用關鍵字using 22.5 為你的命名空間取個別名 22.6 未命名的命名空間 22.6.1 未命名命名空間與全局變量的區別 22.6.2 未命名命名空間與static的區別 22.6.3 未命名命名空間. static與extern的區別 22.7 標準命名空間std 第23章 模板 23.1 什麼是模板 23.2 重載模板 23.3 具體化函數模板 23.3.1 函數模板不能重載 23.3.2 具體化函數模板解決重載問題 23.3.3 具體化函數模板與實例化模板函數 23.4 普通函數. 函數模板與具體化函數模板的優先級 23.4.1 普通函數和函數模板的執行次序 23.4.2 函數模板與具體化函數模板的執行次序 23.4.3 具體化函數模板與普通函數的優先級 23.5 函數模板的匹配 23.6 類模板的定義 23.7 複雜類模板 23.8 數組模板 23.9 對像數組模板 23.10 具有多個參數的模板 23.11 為模板參數提供默認值 23.12 約束模板 23.13 模板成員 23.14 將模板用作參數 23.15 模板和​​友元 23.15.1 非模板友元類和友元函數 23.15.2 通用模板友元類和友元函數 23.15.3 特定類型模板友元函數 23.16 多餘的臨時對象 23.17 靜態成員和模板 23.18 標準模板庫 23.18.1 容器 23.18.2 順序容器 23.18.3 關聯容器 23.18.4 算法類 23.18.5 總結 第24章 異常和錯誤處理 24.1 異常 24.2 設置多條catch語句 24.3 異常的派生 24.4 創建異常類的成員函數 24.5 異常類的虛函數 24.6 異常類與模板的關係 第25章 補充內容 25.1 預處理過程 25.1.1 預處理指令 25.1.2 #include指令 25.1.3 #define指令 25.1.4 用#define指令替換常量 25.1.5 用#define定義一個特定字符串並對其進行測試 25.1.6 #ifdef. #define和#endif的用途 25.1.7 帶參數的#define 25.1.8 宏與內聯函數 25.1.9 #運算符 25.1.10 ##運算符 25.1.11 #undef指令 25.1.12 #if指令 25.1.13 #endif指令 25.1.14 #if defined指令 25.1.15 #ifdef和#ifndef指令 25.1.16 #elif指令 25.1.17 #error指令 25.1.18 #line指令 25.1.19 #pragma 指令 25.2 預定義的宏 25.3 assert()宏 25.4 嘗試編寫一個簡單的assert()宏 25.5 不能為0的變量 25.6 用宏函數來輸出表達式的值 25.7 調試的級別 25.8 C++類型轉換及運行時類型信息(RTII) 25.8.1 動態類型轉換符 25.8.2 靜態類型轉換 25.8.3 重新解釋類型轉換 25.8.4 常類型轉換 25.8.5 運行時類型信息 25.9 關鍵字volatile 25.10 關鍵字const 25.11 關鍵字mutable 25.12 聯合數據類型union 25.13 聯合數據類型的內存佔用 25.14 匿名聯合體 25.15 再談指針 25.15.1 指針與數組 25.15.2 指針操作多維數組 25.15.3 指向多維數組的指針作為函數參數 25.15.4 字符串的指針 25.15.5 接受字符串指針的函數 25.15.6 指向字符串的指針變量與字符數組的區別 25.15.7 指向函數的指針 25.15.8 指向函數的指針的用途 25.15.9 指針數組 25.15.10 指向指針的指針 25.16 位運算 25.16.1 按位與“&”運算符 25.16.2 按位或“|”運算符 25.16.3 異或“^”運算符 25.16.4 取反“~”運算符 25.16.5 左移“<<”運算符 25.16.6 右移“>>”運算符 25.16.7 複合位運算符 25.16.8 不同長度數字的位運算 25.16.9 位運算的實例 25.17 位字段 25.18 區域差異 25.18.1 locale類 25.18.2 默認區域表示或全局區域表示 25.18.3 時間與地理設置 25.18.4 locale與time.h中時間函數的搭配使用 25.18.5 區域表示locale與流的搭配使用 25.18.6 區域表示locale與模板的搭配使用 附錄A ASCII碼對照表 附錄B C++的關鍵字 附錄C C++常用頭文件列表
中文名: 你必须知道的495个C语言问题 高清PDF中文版 原名: C Programming FAQs 作者: (美)萨米特译者: 孙云 朱群英资源格式: PDF 版本: 扫描版 出版社: 人民邮电出版社书号: 9787115194329发行时间: 2009年02月01日 地区: 大陆 语言: 简体中文 简介:   内容简介   本书以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并分别给出了解答,而且结合代码示例阐明要点。   本书结构清晰,讲解透彻,是各高校相关专业C语言课程很好的教学参考书,也是各层次C程序员的优秀实践指南。 作者简介 Steve Summit,著名的C语言专家。Usenet C FAQ的创始人和维护者,有近30年的C编程经验。毕业于麻省理工学院。他曾在华盛顿大学教授C语言课程多年。除本书外,他还与人合著了C Unleashed一书。 编辑推荐 全球C语言程序员集体智慧的结晶   Amazon全五星图书   权威解答495个最常遇到的C语言问题   C是一门简洁精妙的语言,掌握基本语法容易,真正能够自如运用,就不那么简单了。你难免会遇到各种各样的问题,有些可能让你百思不得其解,甚至翻遍图书馆,也找不到问题的答案。   《你必须知道的495个C语言问题》的出版填补了这一空白。书中内容是世界各地的C语言用户多年来在新闻组comp.1ang.c中讨论的成果。作者在网络版CFAQ列表的基础上进行了大幅度的扩充和丰富,结合代码示例,权威而且详细深入地解答了实际学习和工作中最常遇到的495个C语言问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题。许多知识点的阐述都是其他资料中所没有的,弥足珍贵。   涵盖C99标准   “本书是Summit以及C FAQ在线列表的许多参与者多年心血的结晶,是C语言界最为珍贵的财富之一。我向所有C语言程序员推荐本书。”.       ——Francis Glassborow,著名C/C++专家,ACCU(C/C++用户协会)前主席   “本书清晰地阐明了Kernighan与Ritchie的The C Programming Language一书中许多简略的地方,而且精彩地总结了C语言编程实践,强烈推荐!”       ——Yechiel M.Kimchi,以色列理工学院 目录: 第1章 声明和初始化 基本类型 1.1 我该如何决定使用哪种整数类型? 1.2 为什么不精确定义标准类型的大小? 1.3 因为C语言没有精确定义类型的大小,所以我一般都用typedef定义int16和int32。然后根据实际的机器环境把它们定义为int、short、long等类型。这样看来,所有的问题都解决了,是吗? 1.4 新的64位机上的64位类型是什么样的? 指针声明 1.5 这样的声明有什么问题?char *p1, p2; 我在使用p2的时候报错了。 1.6 我想声明一个指针,并为它分配一些空间,但却不行。这样的代码有什么问题?char *p; *p=malloc(10); 声明风格 1.7 怎样声明和定义全局变量和函数最好? 1.8 如何在C中实现不透明(抽象)数据类型? 1.9 如何生成“半全局变量”,就是那种只能被部分源文件中的部分函数访问的变量? 存储类型 1.10 同一个静态(static)函数或变量的所有声明都必须包含static存储类型吗? 1.11 extern在函数声明中是什么意思? 1.12 关键字auto到底有什么用途? 类型定义(typedef) 1.13 对于用户定义类型,typedef 和#define有什么区别? 1.14 我似乎不能成功定义一个链表。我试过typedef struct{char *item; NODEPTR next;}* NODEPTR; 但是编译器报了错误信息。难道在C语言中结构不能包含指向自己的指针吗? 1.15 如何定义一对相互引用的结构? 1.16 Struct{ } x1;和typedef struct{ } x2; 这两个声明有什么区别? 1.17 “typedef int(*funcptr)();”是什么意思? const 限定词 1.18 我有这样一组声明:typedef char *charp; const charp p; 为什么是p而不是它指向的字符为const? 1.19 为什么不能像下面这样在初始式和数组维度值中使用const值?const int n=5; int a[n]; 1.20 const char *p、char const *p和char *const p有什么区别? 复杂的声明 1.21 怎样建立和理解非常复杂的声明?例如定义一个包含N个指向返回指向字符的指针的函数的指针的数组? 1.22 如何声明返回指向同类型函数的指针的函数?我在设计一个状态机,用函数表示每种状态,每个函数都会返回一个指向下一个状态的函数的指针。可我找不到任何方法来声明这样的函数——感觉我需要一个返回指针的函数,返回的指针指向的又是返回指针的函数,如此往复,以至无穷。 数组大小 1.23 能否声明和传入数组大小一致的局部数组,或者由其他参数指定大小的参数数组? 1.24 我在一个文件中定义了一个extern数组,然后在另一个文件中使用,为什么sizeof取不到数组的大小? 声明问题 1.25 函数只定义了一次,调用了一次,但编译器提示非法重声明了。 1.26 main的正确定义是什么?void main正确吗? 1.27 我的编译器总在报函数原型不匹配的错误,可我觉得没什么问题。这是为什么? 1.28 文件中的第一个声明就报出奇怪的语法错误,可我看没什么问题。这是为什么? 1.29 为什么我的编译器不允许我定义大数组,如double array[256][256]? 命名空间 1.30 如何判断哪些标识符可以使用,哪些被保留了? 初始化 1.31 对于没有显式初始化的变量的初始值可以作怎样的假定?如果一个全局变量初始值为“零”,它可否作为空指针或浮点零? 1.32 下面的代码为什么不能编译? intf(){char a[]="Hello, world!";} 1.33 下面的初始化有什么问题?编译器提示“invalid initializers ”或其他信息。char *p=malloc(10); 1.34 char a[]= "string literal";和char *p="string literal"; 初始化有什么区别?当我向p[i] 赋值的时候,我的程序崩溃了。 1.35 char a{[3]}= "abc"; 是否合法? 1.36 我总算弄清楚函数指针的声明方法了,但怎样才能初始化呢? 1.37 能够初始化联合吗? 第2章 结构、联合和枚举 结构声明 2.1 struct x1{ };和typedef struct{ }x2; 有什么不同? 2.2 这样的代码为什么不对?struct x{ }; x thestruct; 2.3 结构可以包含指向自己的指针吗? 2.4 在C语言中用什么方法实现抽象数据类型最好? 2.5 在C语言中是否有模拟继承等面向对象程序设计特性的好方法? 2.6 为什么声明extern f(struct x *p); 给我报了一个晦涩难懂的警告信息? 2.7 我遇到这样声明结构的代码:struct name {int namelen; char namestr[1];};然后又使用一些内存分配技巧使namestr数组用起来好像有多个元素,namelen记录了元素个数。它是怎样工作的?这样是合法的和可移植的吗? 2.8 我听说结构可以赋给变量也可以对函数传入和传出。为什么K&R1;却明确说明不能这样做? 2.9 为什么不能用内建的==和!=操作符比较结构? 2.10 结构传递和返回是如何实现的? 2.11 如何向接受结构参数的函数传入常量值?怎样创建无名的中间的常量结构值? 2.12 怎样从/向数据文件读/写结构? 结构填充 2.13 为什么我的编译器在结构中留下了空洞?这导致空间浪费而且无法与外部数据文件进行“二进制”读写。能否关掉填充,或者控制结构域的对齐方式? 2.14 为什么sizeof返回的值大于结构大小的期望值,是不是尾部有填充? 2.15 如何确定域在结构中的字节偏移量? 2.16 怎样在运行时用名字访问结构中的域? 2.17 C语言中有和Pascal的with等价的语句吗? 2.18 既然数组名可以用作数组的基地址,为什么对结构不能这样? 2.19 程序运行正确,但退出时却“core dump ”(核心转储)了,怎么回事? 联合 2.20 结构和联合有什么区别? 2.21 有办法初始化联合吗? 2.22 有没有一种自动方法来跟踪联合的哪个域在使用? 枚举 2.23 枚举和一组预处理的#define有什么不同? 2.24 枚举可移植吗? 2.25 有什么显示枚举值符号的容易方法吗? 位域 2.26 一些结构声明中的这些冒号和数字是什么意思? 2.27 为什么人们那么喜欢用显式的掩码和位操作而不直接声明位域? 第3章 表达式 求值顺序 3.1 为什么这样的代码不行?a[i]= i++; 3.2 使用我的编译器,下面的代码int i= 7; printf("%d\n", i++ * i++); 打印出49。不管按什么顺序计算,难道不该是56吗? 3.3 对于代码int i=3; i=i++; 不同编译器给出不同的i值,有的为3,有的为4,哪个是正确的? 3.4 有这样一个巧妙的表达式:a^= b^= a^= b; 它不需要临时变量就可以交换a和b的值。 3.5 可否用显式括号来强制执行我所需要的计算顺序并控制相关的副作用?就算括号不行,操作符优先级是否能够控制计算顺序呢? 3.6 可是&&和||操作符呢?我看到过类似while((c = getchar()) != EOF && c != '\n')的代码 3.7 是否可以安全地认为,一旦&&和||左边的表达式已经决定了整个表达式的结果,则右边的表达式不会被求值? 3.8 为什么表达式printf("%d %d", f1(), f2()); 先调用了f2?我觉得逗号表达式应该确保从左到右的求值顺序。 3.9 怎样才能理解复杂表达式并避免写出未定义的表达式?“序列点”是什么? 3.10 在a[i] = i++;中,如果不关心a[]的哪一个分量会被写入,这段代码就没有问题,i也的确会增加1,对吗? 3.11 人们总是说i=i++的行为是未定义的。可我刚刚在一个ANSI编译器上尝试过,其结果正如我所期望的。 3.12 我不想学习那些复杂的规则,怎样才能避免这些未定义的求值顺序问题呢? 其他的表达式问题 3.13 ++i和i++有什么区别? 3.14 如果我不使用表达式的值,那我应该用i++还是++i来做自增呢? 3.15 我要检查一个数是不是在另外两个数之间,为什么if(a b c)不行? 3.16 为什么如下的代码不对?int a=1000, b=1000; long int c=a * b; 3.17 为什么下面的代码总是给出0?double degC, degF; degC= 5.0 / 9 * (degF - 32); 3.18 需要根据条件把一个复杂的表达式赋给两个变量中的一个。可以用下面这样的代码吗?((condition) ? a : = complicated_expression; 3.19 我有些代码包含这样的表达式。a ? b=c : d 有些编译器可以接受,有些却不能。为什么? 保护规则 3.20 “semantics of‘’change in ANSI C”的警告是什么意思? 3.21 “无符号保护”和“值保护”规则的区别在哪里? 第4章 指针 基本的指针应用 4.1 指针到底有什么好处? 4.2 我想声明一个指针并为它分配一些空间,但却不行。这些代码有什么问题呢?char *p; *p =malloc(10); 4.3 *p++自增p还是p所指向的变量? 指针操作 4.4 我用指针操作int数组的时候遇到了麻烦。 4.5 我有一个char *型指针碰巧指向一些int型变量,我想跳过它们。为什么((int *)p)++; 这样的代码不行? 4.6 为什么不能对void *指针进行算术操作? 4.7 我有些解析外部结构的代码,但是它却崩溃了,显示出了“unaligned access”(未对齐的访问)的信息。这是什么意思? 作为函数参数的指针 4.8 我有个函数,它应该接受并初始化一个指针:void f(int *ip){ static int dummy = 5; ip = &dummy;}但是当我如下调用时:int *ip; f(ip); 调用者的指针没有任何变化。 4.9 能否用void ** 通用指针作为参数,使函数模拟按引用传递参数? 48 4.10 我有一个函数extern intf(int *); ,它接受指向int型的指针。我怎样用引用方式传入一个常数?调用f(&5);似乎不行。 4.11 C语言可以“按引用传参”吗? 其他指针问题 4.12 我看到了用指针调用函数的不同语法形式。到底怎么回事? 4.13 通用指针类型是什么?当我把函数指针赋向void *类型的时候,编译通不过。 4.14 怎样在整型和指针之间进行转换?能否暂时把整数放入指针变量中,或者相反? 4.15 我怎样把一个int变量转换为char *型?我试了类型转换,但是不行。 第5章 空指针 空指针和空指针常量 5.1 臭名昭著的空指针到底是什么? 5.2 怎样在程序里获得一个空指针? 5.3 用缩写的指针比较“if(p)”检查空指针是否有效?如果空指针的内部表达不是0会怎样? NULL 宏 5.4 NULL是什么,它是怎么定义的? 5.5 在使用非零位模式作为空指针的内部表示的机器上,NULL 是如何定义的? 5.6 如果NULL定义成#define NULL((char *)0) ,不就可以向函数传入不加转换的NULL 了吗? 5.7 我的编译器提供的头文件中定义的NULL为0L。为什么? 5.8 NULL可以合法地用作函数指针吗? 5.9 如果NULL和0作为空指针常量是等价的,那我到底该用哪一个呢? 5.10 但是如果NULL的值改变了,比如在使用非零内部空指针的机器上,用NULL(而不是0) 不是更好吗? 5.11 我曾经使用过一个编译器,不使用NULL就不能编译。 5.12 我用预处理宏#define Nullptr(type)(type *)0帮助创建正确类型的空指针。 回顾 5.13 这有点奇怪:NULL可以确保是0,但空(null)指针却不一定? 5.14 为什么有那么多关于空指针的疑惑?为什么这些问题如此频繁地出现? 5.15 有没有什么简单点儿的办法理解所有这些与空指针有关的东西呢? 5.16 考虑到有关空指针的所有这些困惑,要求它们的内部表示都必须为0不是更简单吗? 5.17 说真的,真有机器用非零空指针吗,或者不同类型用不同的表示? 地址0上到底有什么? 5.18 运行时的整数值0转换为指针以后一定是空指针吗? 5.19 如何访问位于机器地址0处的中断向量?如果我将指针值设为0,编译器可能会自动将它转换为非零的空指针内部表示。 5.20 运行时的“null pointer assignment”错误是什么意思?应该怎样捕捉它? 第6章 数组和指针 数组和指针的基本关系 6.1 我在一个源文件中定义了char a[6],在另一个源文件中声明了extern char *a。为什么不行? 6.2 可是我听说char a[]和char *a是等价的。是这样的吗? 6.3 那么,在C语言中“指针和数组等价”到底是什么意思? 6.4 既然它们这么不同,那为什么作为函数形参的数组和指针声明可以互换呢? 数组不能被赋值 6.5 为什么不能这样向数组赋值?extern char *getpass(); char str[10]; str=getpass("Enter password:"); 6.6 既然不能向数组赋值,那这段代码为什么可以呢?int f(char str[]){ if(str[0] == '\0') str="none";} 6.7 如果你不能给它赋值,那么数组如何能成为左值呢? 回顾 6.8 现实地讲,数组和指针的区别是什么? 6.9 有人跟我讲,数组不过是常指针。这样讲准确吗? 6.10 我还是很困惑。到底指针是一种数组,还是数组是一种指针? 6.11 我看到一些“搞笑”的代码,包含5["abcdef"]这样的“表达式”。这为什么是合法的C语言表达式呢? 数组的指针 6.12 既然数组引用会退化为指针,如果array是数组,那么array和&array;又有什么区别呢? 6.13 如何声明一个数组的指针? 动态数组分配 6.14 如何在运行时设定数组的大小?怎样才能避免固定大小的数组? 6.15 我如何声明大小和传入的数组一样的局部数组? 6.16 如何动态分配多维数组? 6.17 有个很好的窍门,如果我这样写:int realarray[10]; int *array = &realarray;[-1]; 我就可以把“array”当作下标从1 开始的数组。 函数和多维数组 6.18 当我向一个接受指针的指针的函数传入二维数组的时候,编译器报错了。 6.19 我怎样编写接受编译时宽度未知的二维数组的函数? 6.20 我怎样在函数参数传递时混用静态和动态多维数组? 数组的大小 6.21 当数组是函数的参数时,为什么sizeof不能正确报告数组的大小? 6.22 如何在一个文件中判断声明为extern的数组的大小(例如,数组定义和大小在另一个文件中)?sizeof操作符似乎不行。 6.23 sizeof返回的大小是以字节计算的,怎样才能判断数组中有多少个元素呢? 第7章 内存分配 第8章 字符和字符串 第9章 布尔表达式和变量 第10章 C预处理器 第11章 ANSI/ISO标准C 第12章 标准输入输出库 第13章 库函数 第14章 浮点运算 第15章 可变参数列表 第16 章 奇怪的问题 第17章 风格 第18章 工具和资源 第19章 系统依赖 第20章 杂项 术语表 参考文献
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值