1.函式定義
函式的定義就是函式體的實現。函式體就是乙個**塊,它在函式被呼叫時執行。與函式定義相反,函式宣告出現在函式被呼叫的地方。函式宣告向編譯器提供該函式的相關資訊,用於確保函式被正確地呼叫。
形式引數列表包括變數名和它們的型別宣告。**塊包含了區域性變數的宣告和函式呼叫時需要執行的語句。
2.函式宣告
當編譯器遇到乙個函式呼叫時,它產生**傳遞引數並呼叫這個函式,而且接受該函式返回的值。
1)原型:向編譯器提供一些關於函式的特定資訊顯得更為安全,可以通過兩種方法來實現。首先如果同一原始檔的前面已經出現了該函式的定義,編譯器就會記住它的引數數量和型別,以及函式的返回值型別;接著編譯器便可以檢查該函式的所有後續呼叫(在同一原始檔中),確保它們是正確的。第2種嚮編譯器提供函式資訊的方法是使用函式原型,原型總結了函式定義的起始部分的宣告,向編譯器提供有關該函式應該如何呼叫的完整資訊。使用原型最方便(且最安全)的方法是把原型置於乙個單獨的檔案,當其他原始檔需要這個函式的原型時,就使用#include指令包含該檔案。
a)現在函式原型具有檔案作用域,所以原型的乙份拷貝可以作用於整個原始檔,較之在該函式每次呼叫前單獨書寫乙份函式原型容易得多;
b)現在函式原型只書寫一次,這樣就不會出現多份原型的拷貝之間的不匹配現象;
c)如果函式的定義進行修改,我們只需修改函式原型,並重新編譯所有包含了該原型的原始檔即可;
d)如果函式的原型同時也被#include指令包含到定義函式的檔案中,編譯器就可以確認函式原型與函式定義的匹配;
通過只書寫函式原型一次,消除了多份原型的拷貝間不一致的可能性。
2)函式的預設認定:當程式呼叫乙個無法見到原型的函式時,編譯器便認為該函式返回乙個整型值。對於那些並不返回整型值的函式,這種認定可能會引起錯誤。所有的函式都應該具有原型,尤其是那些返回值不是整型的函式。
3.函式的引數
c函式的所有引數均以「傳值呼叫」方式進行傳遞,這意味著函式將獲得引數值的乙份拷貝。c的規則很簡單:所有引數都是傳值呼叫。陣列引數的這種行為似乎與傳值呼叫相悖,但是此處其實並無矛盾之處——陣列名的值實際上是乙個指標,傳遞函式的就是這個指標的乙份拷貝。下標引用實際上是間接訪問的另一種形式,它可以對指標執行間接訪問操作,訪問指標指向的記憶體位置。
4.adt和黑盒
c可以用於設計和實現抽象資料型別(adt),因為它可以限制函式和資料定義的作用域,這個技巧也被稱為黑盒(black box)設計。限制對模組的訪問是通過static關鍵字的合理使用實現的,它可以限制對那些並非介面的函式和資料的訪問。
5.遞迴
c通過執行時堆疊支援遞迴函式的實現,遞迴函式就是直接或間接呼叫自身的函式。
1)追蹤遞迴函式:追蹤乙個遞迴函式執行過程的關鍵是理解函式中所宣告的變數是如何儲存的,當函式被呼叫時,它的變數的空間是建立於執行時堆疊上的,以前呼叫函式的變數仍保留在堆疊上,但它們被新函式的變數所掩蓋,因此是不能被訪問的。
2)遞迴與迭代:遞迴是一種強有力的技巧,但和其它技巧一樣,它也可能被誤用。遞迴所需要的兩個特性:存在限制條件,當符合這個條件時遞迴便不再繼續;每次遞迴呼叫之後越來越接近這個限制條件。
6.可變引數列表
1)stdarg巨集:這個標頭檔案宣告了乙個型別va_list和三個巨集——va_start、va_arg和va_end。
2)可變引數的限制:注意,可變引數必須從頭到尾按照順序逐個訪問。
7.警告的總結
1)錯誤地在其它函式的作用域內編寫函式原型;
2)沒有為那些返回值不是整型的函式編寫原型;
3)把函式原型和舊式風格的函式定義混合使用;
4)在va_arg中使用錯誤的引數型別,導致未定義的結果;
8.程式設計提示的總結
1)在函式原型中使用引數名,可以給使用該函式的使用者提供更多的資訊;
2)抽象資料型別可以減少程式對模組實現細節的依賴,從而提高程式的可靠性;
3)當遞迴定義清晰的優點可以補償它的效率開銷時,就可以使用這個工具;
C和指標讀書筆記 第7章(函式)
1.把函式的型別與函式名分寫成兩行純屬風格問題。這種寫法可以使我們在使用視覺或者某些工具追蹤 時更容易查詢程式。2.ruturn 語法並沒有要求你加上括號。3.向編譯器提供函式資訊的方法是使用函式原型。原型總結了函式定義的起始部分的宣告,向編譯器提供有關該函式應該如何呼叫的完整資訊。在函式原型後面要...
C和指標 學習筆記 第15章 輸入 輸出函式
1.錯誤報告 perror函式以一種簡單 統一的方式報告錯誤。標準庫函式在乙個外部整型變數errno 在errno.h中定義 中儲存錯誤 之後把這個資訊傳遞給使用者程式,提示操作失敗的準確原因。perror函式簡化向使用者報告這些特點錯誤的過程。它的原型定義與stdio.h void perror ...
筆記《C和指標》第4章語句
語句 4.1 空語句 本身只包含乙個分號 4.2 表示式語句 表示式 分號 4.3 塊語句 位於一對花括號內的可選的宣告和語句列表 4.4 if 所有非零值 為真 4.5 while expression 先執行測試,再執行迴圈體 4.5.1 break 終止迴圈,執行下一句 迴圈正常結束後應執行的...