C語言常見問題 pdf

2021-04-21 22:12:47 字數 2003 閱讀 3084

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編譯器不會對陣列...