c的設計原則是把函式作為程式的構成模組。
函式原型宣告只是將函式型別告訴編譯器,並不是函式的實際實現。
ansi c使用函式原型來宣告函式的返回值型別、引數個數以及引數型別,通過這種方式,編譯器可以檢查函式呼叫語句是否和其原型宣告相一致(比如檢查引數個數、引數型別是否匹配)。若有引數型別不匹配但都是數值型別,編譯器會自動把實際引數轉換為和形式引數型別相同的數值。
int imax(int,int); //原型宣告中的形參名字可省略,因為編譯器並不關心形參的名字
int imax(int a,int b); //原型宣告中的形參具有函式原型作用域,不必和函式定義中使用的變數名相匹配。
void imax(void); //宣告函式既不接受引數也沒有返回值
void imax(); //ansi c編譯器會認為未使用函式原型宣告該函式,不進行引數檢查,應避免
int
printf(char *,...); //表示第乙個引數是乙個字串,而其與引數的個數以及型別不能確定
函式定義是函式的實際實現**,函式定義的一般格式為:
函式型別 函式名(形參型別1 形參1,形參型別2 形參2,...)//ansi c函式頭
形式參量(formal parameter):函式的輸入引數,屬於區域性變數,為函式私有的,具有**塊作用域
注意:ansi c要求每個形參都要宣告其型別,void dibs(int x,y,z)
這種函式頭是錯誤的。
return語句:通過return語句函式被呼叫函式可以返回乙個值給呼叫函式,返回的值的型別由函式型別(function type)指定。
int imin(int, int);
void main(void)
printf("bye.\n");
}int imin(int n, int m)
int imin(int n, int m)
int imin(int n, int m)
answer = 2 * imin(z, zstar) + 25;
printf("%d\n", imin(-32 + answer, limit));
實際引數(actual argument)
形式參量是被呼叫函式的區域性變數,實際引數是呼叫函式分配給被呼叫函式的形式參量的具體值。
實際引數可以是常量、變數或乙個複雜的表示式,無論何種形式,函式呼叫時首先計算其值,然後將該值賦值給被呼叫函式的形式參量。
函式被呼叫時,建立宣告為形式參量的變數(分配記憶體),然後用計算後得到的實際引數的值初始化該變數。
#include
#include
#define name "gigathink, inc."
#define address "101megabuck plaza"
#define place "megapolis, ca 94904"
#define width 40
#define space ' '
void show_n_char(char ch, int num); //函式原型宣告
void main(void)
void show_n_char(char ch, int num) //函式定義,形參ch,num為函式的私有區域性變數
在單檔案c程式中,函式的使用較簡單,一般用法是:
這種結構的好處是程式結構清晰,main函式中只做函式呼叫,函式的實現都在定義中。
對於多檔案c程式,函式的原型宣告、定義和呼叫可能並不在乙個檔案中,這時函式的使用就稍微複雜一些,但是函式的使用原則還是相同的,即在函式呼叫所在的檔案中必須先進行函式原型宣告。
如果file1.c檔案中的函式1需要呼叫file2.c檔案中的函式2,首先函式2必須具有外部鏈結(即原型宣告無static修飾或有extern修飾),然後需要在file1.c檔案中對函式2進行原型宣告,這樣就可以在file1.c檔案中呼叫函式2了。
如果程式有很多個檔案中的函式都需要呼叫函式2,則需要在每個呼叫函式2的檔案中都對其進行原型宣告,這樣很不方便,c提供了一種使用標頭檔案(.h檔案)的方法來避免這種複雜的操作。
把具有外部鏈結的函式原型宣告放在標頭檔案中,需要呼叫該函式的檔案在頭部使用#include語句包含對應的標頭檔案即可。
而對於具有內部鏈結的函式,需要在函式定義的原始檔中進行函式原型宣告,並且必須有static修飾。
標頭檔案中除了進行外部函式的原型宣告外,還應該包含用#define語句定義的常量。
前文中介紹了呼叫函式向被呼叫函式傳遞值以及被呼叫函式返回乙個值的方法。
向被呼叫函式傳遞值的方式是最簡單的,稱為值傳遞,這種方式只是將實際引數的值賦給了形式參量,函式對形式參量的操作不會影響到實際引數。
如果想要在被呼叫函式中改變呼叫函式中的變數,則需要用其他的方式。
另外,如果被呼叫函式需要返回超過乙個值,那麼return返回值的方法就做不到了,需要用其他方式。
函式間通訊的三種方式:
值傳遞就是呼叫函式通過實際引數把值賦給形式參量,被呼叫函式中的形式參量是私有的區域性變數,對其進行的任何操作都不會改變實際引數。
void exchg1(int x, int y)//形參為int型別變數
void main(void)
程式輸出結果
x = 6, y = 4
a = 4, y = 6
main函式呼叫exchg1函式時候的隱含操作為:
int x = a;
int y = b;
即建立int型別變數x、y並分別用a、b的值初始化。因此對x、y的任何操作並不會影響到a、b。
對形參內容的操作就是對實參本身的操作。
void exchg2(int *px, int *py)//形參為指向int型別的指標變數
void main(void)
main函式呼叫exchg2函式時候的隱含操作為:
int *px = &a;
int *py = &b;
即建立指向int型別的指標變數px、py,並分別用a、b的位址初始化,因此px、py分別指向a、b,對*px、*py的操作實際就是對變數a、b本身的操作。
void exchg3(int &x, int &y) // 注意定義處的形式引數的格式與值傳遞不同
main()
引用傳遞在形式上與值傳遞唯一區別是在定義的時候有取位址符」&「,x、y相當於a、b的「別名」,對x、y的操作實際就是對a、b本身的操作。 c primer plus學習筆記
1.變數名命名規則 重要的 1 有含義 2 只能用字母字元 數字和下劃線 3 第乙個字元不能是數字 4 區分大小寫 5 不能用c 關鍵字 2.整型 1 無符合型別不能表負值 2 char short 16 int short long 32,int 和longlong 64,long c 11 寬度...
C PrimerPlus學習筆記
if語句中判斷恒等,將常量放前,防止由於 寫成 造成的難以查詢的bug。if 0 count 若寫成 0 count 會報錯,count 0 則不會命名空間 using namespace std cout one cout two std cout one std cout two using s...
C Primer Plus學習筆記
1.組合語言是特地的cpu設計所採用的一組內部指令的助記符,不同的cpu型別使用不同的cpu c給予你更多的自由,也讓你承擔更多的風險 自由的代價是永遠的警惕 2.目標 檔案 可執行檔案和庫 3.可以用畫幾個盒子的方式來跟蹤乙個程式的變數 一門語言的語法就是一套規則,用於管理這種語言中的合法語句組織...