4.8 我看到了用指標呼叫函式的不同語法形式。到底怎麼回事?
最初, 乙個函式指標必須用* 操作符(和一對額外的括弧) 「轉換為」 乙個「真
正的」 函式才能呼叫:
int r, func(), (*fp)() = func;
r = (*fp)();
而函式總是通過指標進行呼叫的, 所有「真正的」 函式名總是隱式的退化為指
針(在表示式中, 正如在初始化時一樣。)。這個推論表明無論fp 是
函式名和函式的指標
r = fp();
ansi c 標準實際上接受後邊的解釋, 這意味著* 操作符不再需要, 儘管依然
允許。4.7 c 有「按引用傳遞」 嗎?
真的沒有。
嚴格地講, c 總是按值傳遞。你可以自己模擬按引用傳遞, 定義接受指標的函
數, 然後在呼叫時使用& 操作符。事實上, 當你向函式傳入陣列(傳入指標的情況
參見問題6.4 及其它) 時, 編譯器本質上就是在模擬按引用傳遞。但是c 沒有任何
真正等同於正式的按引用傳遞或c++ 的引用引數的東西。
2.16 列舉和一組預處理的#define 有什麼不同?
只有很小的區別。c 標準中允許列舉和其它整形類別自由混用而不會出錯。
(但是, 假如編譯器不允許在未經明確型別轉換的情況下混用這些型別,則聰明
地使用列舉可以捕捉到某些程式錯誤。)
列舉的一些優點: 自動賦值; 偵錯程式在檢驗列舉變數時, 可以顯示符號值; 它們
服從資料塊作用域規則。(編譯器也可以對在列舉變數被任意地和其它型別混用
時, 產生非重要的警告資訊, 因為這被認為是壞風格。)乙個缺點是程式設計師不能控
制這些對非重要的警告; 有些程式設計師則反感於無法控制列舉變數的大小。
2.12 如何確定域在結構中的位元組偏移?
ansi c 在中定義了offsetof() 巨集, 用offsetof(struct s, f) 可以計
算出域f 在結構s 中的偏移量。如果出於某種原因, 你需要自己實現這個功能, 可
以使用下邊這樣的**:
#define offsetof(type, f) ((size_t) /
((char *)&((type *)0)->f - (char *)(type *)0))
這種實現不是100% 的可移植; 某些編譯器可能會合法地拒絕接受。
7.26 calloc() 和malloc() 有什麼區別?利用calloc 的零填充功能安
全嗎?free() 可以釋放calloc() 分配的記憶體嗎, 還是需要乙個
cfree()?
calloc(m, n) 本質上等價於
p = malloc(m * n);
memset(p, 0, m * n);
填充的零是全零, 因此不能確保生成有用的空指標值或浮點零值(參見第5
章)。free() 可以安全地用來釋放calloc() 分配的記憶體。
5.12 我很困惑。我就是不能理解這些空指標一類的東西。
有兩條簡單規則你必須遵循:
1. 當你在原始碼中需要空指標常數時, 用「0」 或「null」。
2. 如果在函式呼叫中「0」 或「null」 用作引數, 把它轉換成被調函式需要的指
針型別5.13 考慮到有關空指標的所有這些困惑, 難道把要求它們內部表達都必
須為0 不是更簡單嗎?
因為它會不必要地限制某些實
現, 阻止它們用特殊的非全零值表達空指標, 尤其是當那些值可以為非法訪問引發
自動的硬體陷阱的時候。
況且, 這樣的要求真正完成了什麼呢?對空指標的正確理解不需要內部表達
的知識, 無論是零還是非零。假設空指標內部表達為零不會使任何**的編寫更
容易(除了一些不動腦筋的calloc() 呼叫; 參見問題7.26)。用零作空指標的內部表
達也不能消除在函式呼叫時的型別轉換, 因為指標的大小可能和int 型的大小依然
不同。(如果象上文問題5.11 所述, 用「nil」 來請求空指標, 則用0 作空指標的內
部表達的想法都不會出現。)
C語言常見問題
在c語言中,有乙個 流 的概念 流可以分為兩種型別 文字流 檔案 和二進位製流 檔案 文字流是解釋性的,最長可達255個字元 二進位製流是非解釋性的,一次處理乙個字元。在用c語言程式設計的時候,我們都是用 include指令包含型別為 h 的檔案,那麼可以用該指令包含型別不為 h 的檔案嗎?答案是 ...
C語言常見問題
1 嵌入式與微控制器的區別 從軟體上,行業裡經常把晶元中不帶mmu memory management unit記憶體管理單元 從而不支援虛擬位址,只能裸奔或執行rtos 實時作業系統,例如ucos 華為liteos rt thread freertos 的system,叫做微控制器 例如stm32...
C語言常見問題總結
1.用 注釋 在c語言中不是好辦法,尤其是在注釋的 中原先已經有注釋存在,可能會報錯,更好的辦法是用 if 和 endif 2.如果有一些宣告需要用於幾個不同的原始檔,可以在乙個單獨的檔案編寫這些宣告,然後用 include命令把這個檔案包含到需要使用這些宣告的原始檔中 3.標準的c編譯器不會對陣列...