你必須知道的495個C語言問題

你必須知道的495個C語言問題
定價:270
NT $ 213
  • 作者:(美)薩米特
  • 出版社:人民郵電出版社
  • 出版日期:2016-04-01
  • 語言:簡體中文
  • ISBN10:711537676X
  • ISBN13:9787115376763
  • 裝訂:262頁 / 普通級 / 1-1
 

內容簡介

以問答的形式組織內容,討論了學習或使用C語言的過程中經常遇到的一些問題。書中列出了C用戶經常問的400多個經典問題,涵蓋了初始化、數組、指針、字符串、內存分配、庫函數、C預處理器等各個方面的主題,並分別給出了解答,而且結合代碼示例闡明要點。

《你必須知道的495個C語言問題》結構清晰,講解透徹,是各高校相關專業C語言課程很好的教學參考書,也是各層次C程序員的實踐指南。

薩米特,畢業於麻省理工學院,有15年的C編程經驗。他在Internet上廣受尊重,並且維護着Usenet新聞組comp.lang.c的FAQ列表。他當前從事C和UNIX的教學工作,並致力於各種C和UNIX項目,其重點是積極的可移植代碼和接口設計。
 

目錄

第1章 聲明和初始化 
基本類型 
1.1 我該如何決定使用哪種整數類型? 1 
1.2 為什麼不精確定義標准類型的大小? 
1.3 因為C語言沒有精確定義類型的大小,所以我一般都用typedef定義int16和int32。
然后根據實際的機器環境把它們定義為int、short、long等類型。這樣看來,所有的問題都解決了,是嗎? 2 
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;}* N
但是編譯器報了錯誤信息。難道在C語言中結構不能包含指向自己的指針嗎? 7 
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個指向返回指向字符的指針的函數的指針的數組? 11 
1.22 如何聲明返回指向同類型函數的指針的函數?我在設計一個狀態機,用函數表示每種狀態,每個函數都會返回一個指向下一個狀態的函數的指針。
可我找不到任何方法來聲明這樣的函數——感覺我需要一個返回指針的函數,返回的指針指向的又是返回指針的函數……,如此往復,以至無窮。 12 
數組大小 
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 對於沒有顯式初始化的變量的初始值可以作怎樣的假定?如果一個全局變量初始值為「零」,它可否作為空指針或浮點零? 18 
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] 賦值的時候,我的程序崩潰了。 19 
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 name
然后又使用一些內存分配技巧使namestr數組用起來好像有多個元素,namelen記錄了元素個數。它是怎樣工作的?這樣是合法的和可移植的嗎? 23 
2.8 我聽說結構可以賦給變量也可以對函數傳入和傳出。為什麼K&R1卻明確說明不能這樣做? 
2.9 為什麼不能用內建的==和!=操作符比較結構? 
2.10 結構傳遞和返回是如何實現的? 
2.11 如何向接受結構參數的函數傳入常量值?怎樣創建無名的中間的常量結構值? 
2.12 怎樣從/向數據文件讀/寫結構? 27結構填充 
2.13 為什麼我的編譯器在結構中留下了空洞?這導致空間浪費而且無法與外部數據文件進行「二進制」讀寫。能否關掉填充,或者控制結構域的對齊方式? 
2.14 為什麼sizeof返回的值大於結構大小的期望值,是不是尾部有填充? 
2.15 如何確定域在結構中的字節偏移量? 
2.16 怎樣在運行時用名字訪問結構中的域? 
2.17 C語言中有和Pascal的with等價的語句嗎? 
2.18 既然數組名可以用作數組的基地址,為什麼對結構不能這樣? 
2.19 程序運行正確,但退出時卻「core dump 」(核心轉儲)了,怎麼回事? 29聯合 
2.20 結構和聯合有什麼區別? 
2.21 有辦法初始化聯合嗎? 
2.22 有沒有一種自動方法來跟蹤聯合的哪個域在使用? 30枚舉 
2.23 枚舉和一組預處理的#define有什麼不同? 
2.24 枚舉可移植嗎? 
2.25 有什麼顯示枚舉值符號的容易方法嗎? 31位域 
2.26 一些結構聲明中的這些冒號和數字是什麼意思? 
2.27 為什麼人們那麼喜歡用顯式的掩碼和位操作而不直接聲明位域? 

第3章 表達式
第4章 指針
第5章 空指針
第6章 數組和指針
第7章 內存分配
第8章 字符和字符串
第10章 C預處理器
第11章 ANSI/ISO標准
第12章 標准輸入輸出庫
第13章 庫函數
第14章 浮點運算
第15章 可變參數列表
第16章 奇怪的問題
第17章 風格
第18章 工具和資源
第19章 系統依賴
第20章 雜項 
術語表 
參考文獻
網路書店 類別 折扣 價格
  1. 新書
    79
    $213