前面已經(jīng)說過,C語言中的函數(shù)就是面向對象中的"方法",C語言的函數(shù)可以大概分為3類:
1.主函數(shù),也就是main函數(shù)。每個程序中只能有一個、也必須有一個主函數(shù)。無論主函數(shù)寫在什么位置,C程序總是從主函數(shù)開始執(zhí)行
2.開發(fā)人員自定義的函數(shù),可有可無,數(shù)目不限
3.C語言提供的庫函數(shù),例如stdio.h中的輸出函數(shù)PRintf()和輸入函數(shù)scanf()
雖說C中的函數(shù)類似于java中的方法,但在使用上還是有區(qū)別的。
1 public void test() {2 int c = sum(1, 4);3 }4 5 public int sum(int a, int b) {6 return a + b;7 }第1行定義的test方法可以調用在第5行定義的sum方法
1 int sum(int a, int b) {2 return a + b;3 }4 5 int main()6 {7 int c = sum(1, 4);8 return 0;9 }第5行定義的main函數(shù)調用了第1行的sum函數(shù),這是合法的。如果調換下sum函數(shù)和main函數(shù)的順序,在標準的C編譯器環(huán)境下是不合法的(不過在Xcode中只是警告,Xcode中用的是GCC編譯器)
1 // 只是做個函數(shù)聲明,并不用實現(xiàn) 2 int sum(int a, int b); 3 4 int main() 5 { 6 int c = sum(1, 4); 7 return 0; 8 } 9 10 // 函數(shù)的定義(實現(xiàn))11 int sum(int a, int b) {12 return a + b;13 }我們在第2行做了sum函數(shù)的聲明,然后在第6行(main函數(shù)中)就可以正常調用sum函數(shù)了。
函數(shù)的聲明格式:
返回值類型 函數(shù)名 (參數(shù)1, 參數(shù)2, ...)
可以省略參數(shù)名稱,比如上面的sum函數(shù)聲明可以寫成這樣:
int sum(int, int);
只要你在main函數(shù)前面聲明過一個函數(shù),main函數(shù)就知道這個函數(shù)的存在,就可以調用這個函數(shù)。究竟這個函數(shù)是做什么用,還要看函數(shù)的定義。如果只有函數(shù)的聲明,而沒有函數(shù)的定義,那么程序將會在鏈接時出錯。
下面我們將sum函數(shù)的聲明和定義分別放在sum.h和sum.c中
sum.h文件

sum.c文件

然后在main.c中包含sum.h即可使用sum函數(shù)

其實sum.h和sum.c的文件名不一樣要相同,可以隨便寫,只要文件名是合法的
運行步驟分析:
1> 在編譯之前,預編譯器會將sum.h文件中的內(nèi)容拷貝到main.c中
2> 接著編譯main.c和sum.c兩個源文件,生成目標文件main.obj和sum.obj,這2個文件是不能被單獨執(zhí)行的,原因很簡單:
* sum.obj中不存在main函數(shù),肯定不可以被執(zhí)行
* main.obj中雖然有main函數(shù),但是它在main函數(shù)中調用了一個sum函數(shù),而sum函數(shù)的定義卻存在于sum.obj中,因此main.obj依賴于sum.obj
3> 把main.obj、sum.obj鏈接在一起,生成可執(zhí)行文件
4> 運行程序

大家都知道#include的功能是拷貝內(nèi)容,因此上面的代碼等效于:

這么一看,語法上是絕對沒有問題的,但是絕對運行不起來,在鏈接時會出錯。原因:編譯器會編譯所有的.c源文件,這里包括main.c、sum.c,編譯成功后生成sum.obj、main.obj文件,當鏈接這兩個文件時鏈接器會發(fā)現(xiàn)sum.obj和main.obj里面都有sum函數(shù)的定義,于是報"標識符重復"的錯誤。
在定義函數(shù)時,函數(shù)名后面的()中定義的變量稱為形式參數(shù)(形參);在調用函數(shù)時傳入的值稱為實際參數(shù)(實參)。
// b是test函數(shù)的形參(形式參數(shù))void test(int b)
{ b = 9; // 改變了形參b的值}int main(){ int a = 10; printf("函數(shù)調用前的a:%d/n", a); test(a); // a是test函數(shù)的實參(實際參數(shù)) printf("函數(shù)調用后的a:%d", a); return 0;}
如果是基本數(shù)據(jù)類型作為函數(shù)的形參,那是簡單的值傳遞,將實參a的值賦值給了形參b,相當于
int a = 10;int b = a;b = 9;
a和b是分別有著不同內(nèi)存地址的2個變量,因此改變了形參b的值,并不會影響實參a的值。
上述代碼的輸出結果為:
C程序由函數(shù)構成。函數(shù)是C程序的基本單位。程序的全部工作都是由各個函數(shù)分別完成。被調用的函數(shù)可以是系統(tǒng)提供的庫函數(shù),也可以是用戶根據(jù)需要自己編制設計的函數(shù)。C的函數(shù)相當于其他語言中的子程序。
一個較大的程序一般應分為若干個程序模塊,每一個模塊用來實現(xiàn)特定的功能。
一個C程序可由一個主函數(shù)和若干個其他函數(shù)構成。由主函數(shù)調用其他函數(shù),其他函數(shù)也可以互相調用。同一個函數(shù)可以被一個或多個函數(shù)調用多次。
在程序開發(fā)中,常將一些常用的功能模塊編寫成函數(shù),放在公共函數(shù)庫中供大家選用。程序設計人員要善于利用函數(shù),以減少重復編寫程序段的工作量。
一個C程序由一個或多個程序模塊組成,每一個模塊作為一個源程序文件。對于較大程序,一般不希望把所有內(nèi)容全放在一個文件中,而是將它們分別放在若干個源文件中,再由若干個源程序文件組成一個C程序。這樣寫便于分別編寫、分別編譯,提高調試效率。一個源程序文件可以由多個C程序公用。
一個源程序文件由一個或多個函數(shù)以及其它內(nèi)容(命令行、數(shù)據(jù)定義等)組成。一個源程序文件是一個編譯單位,在程序編譯時是以源程序文件為單位進行編譯,而不是以函數(shù)為單位進行編譯。
C程序的執(zhí)行是從main函數(shù)開始的,如果在main函數(shù)中調用其他函數(shù),在調用后流程返回到main函數(shù),在main函數(shù)中結束整個程序的運行
所有函數(shù)都是平行的,即在定義函數(shù)時是分別進行的,是互相獨立的。一個函數(shù)并不從屬與另一個函數(shù),即函數(shù)不能嵌套定義。函數(shù)可以互相調用,但不能調用main函數(shù),main函數(shù)由系統(tǒng)調用
新聞熱點
疑難解答