內部函數和外部函數
函數一旦定義後就可被其它函數調用。 但當一個源程序由多個源文件組成時, 在一個源文件中定義的函數能否被其它源文件中的函數調用呢?為此,C語言又把函數分為兩類:
一、內部函數
如果在一個源文件中定義的函數只能被本文件中的函數調用,而不能被同一源程序其它文件中的函數調用, 這種函數稱為內部函
數。定義內部函數的一般形式是: static 類型說明符 函數名(形參表) 例如:
static int f(int a,int b) 內部函數也稱為靜態函數。但此處靜態static 的含義已不是指存儲方式,而是指對函數的調用范圍只局限於本文件。 因此在不同的源文件中定義同名的靜態函數不會引起混淆。
二、外部函數
外部函數在整個源程序中都有效,其定義的一般形式為: extern 類型說明符 函數名(形參表) 例如:
extern int f(int a,int b)如在函數定義中沒有說明extern或static則隱含為extern。在一個源文件的函數中調用其它源文件中定義的外部函數時,應 用extern說明被調函數為外部函數。例如:
F1.C (源文件一)
main()
{
extern int f1(int i); /*外部函數說明,表示f1函
數在其它源文件中*/
……
}
F2.C (源文件二)
extern int f1(int i); /*外部函數定義*/
{
……
}
本章小結
1. 函數的分類
(1)庫函數:由C系統提供的函數;
(2)用戶定義函數:由用戶自己定義的函數;
(3)有返回值的函數向調用者返回函數值,應說明函數類型( 即返回值的類型 );
(4)無返回值的函數:不返回函數值,說明為空(void)類型;
(5)有參函數:主調函數向被調函數傳送數據;
(6)無參函數:主調函數與被調函數間無數據傳送;
(7)內部函數:只能在本源文件中使用的函數;
(8)外部函數:可在整個源程序中使用的函數。
2. 函數定義的一般形式
[extern/static] 類型說明符 函數名([形參表]) 方括號內為可選項。
3. 函數說明的一般形式 [extern] 類型說明符 函數名([形參表]);
4. 函數調用的一般形式 函數名([實參表])
5. 函數的參數分為形參和實參兩種,形參出現在函數定義中,實參出現在函數調用中,發生函數調用時,將把實參的值傳送給形參。
6. 函數的值是指函數的返回值,它是在函數中由return語句返回的。
7. 數組名作為函數參數時不進行值傳送而進行地址傳送。形參和實參實際上為同一數組的兩個名稱。因此形參數組的值發生變化,實參數組的值當然也變化。
8. C語言中,允許函數的嵌套調用和函數的遞歸調用。
9. 可從三個方面對變量分類,即變量的數據類型,變量作用域和變量的存儲類型。在第二章中主要介紹變量的數據類型,本章中介紹了變量的作用域和變量的存儲類型。
10.變量的作用域是指變量在程序中的有效范圍, 分為局部變量和全局變量。
11.變量的存儲類型是指變量在內存中的存儲方式,分為靜態存儲和動態存儲,表示了變量的生存期。
12.變量分類特性表存儲方式存儲類型說明符何處定義生存期作用域賦值前的值可賦初值類型動態存儲自動變量 auto 寄存器變量 register 函數或復合語句內被調用時在定義它的函數或復合語句內不定基本類型int或char外部變量extern函數之外整個源程序整個源程序靜態局部變量static 函數或復合語句內靜態全局變量static 函數之外整個源程序在定義它的函數或復合語句內在定義它的源文件內0任何類型.