C語言 函式篇
C語言 函式篇
1 函式的定義
- 函式的定義通常包括:
返回值型別 函式名(形參表說明) /*函式首部*/
{
說明語句 /*函式體*/
執行語句
}
說明:
(1)返回值型別:即函式返回值
函式返回值不能是陣列,也不能是函式,除此之外任何合法的資料型別都可以是函式的型別,如:int,long,float,char 等。函式型別可以省略,當不指明函式型別時,系統預設的是整型。 返回值的型別。
(2)函式名:使用者自定義的識別符號,在 C 語言函式定義中不可省略(須符合C語言對識別符號的規範,用於標識函式,並用該識別符號呼叫函式)另外函式名本身也有值,它代表了該函式的入口地址,使用指標 呼叫函式
(3)形參:形參表是用逗號分隔的一組變數說明,包括形參的型別和形參的標識 符,其作用是指出每一個形參的型別和形參的名稱,當呼叫函式時,接收來自主調函式的資料,確定各參 數的值。
(4)函式體:用{ }括起來的部分是函式的主體。函式內部應有自己的說明語句和執行語句,但函式內定義的變數不可以與形參同名
2 函式的呼叫
- 什麼叫做函式呼叫:就是執行函式,比如
printf("%d",a);
就是執行了C內建的printf()函式,
- C語言中函式呼叫的一般形式為:
函式名(型別 形參,型別 形參.....);
【注意】形參和實參
(1) 實參(argument),全名為”實際引數“,實參可以是常數(a=2)、變數(x)、表示式(max(x+y))、函式(printf("%d",max(a)))等在進行函式呼叫時,它們都必須具有確定的值
(2) 形參(parameter),全程為“形式引數”,它不是實際存在變數,是在定義函式名和函式體的時候使用的引數,目的是用來接收呼叫該函式時傳入的引數.在呼叫函式時,實參將賦值給形參。因而,必須注意實參的個數,型別應與形參一一對應,並且實參必須要有確定的值。
-
C語言呼叫函式的方法:
-
函式表示式:函式(如printf())作為表示式中的一項出現在表示式中,以函式的返回值參與函式的運算。所以這種方法需要函式有返回值。
z=max(x,y);/*max()函式需要有返回值,給變數z賦值。*/
-
函式語句:函式呼叫的一般形式(函式名(型別 形參,型別 形參…))加上分號:
printf ("%d",a); scanf ("%d",&b);
- 函式實參:函式作為另一個函式呼叫的實際引數出現。同理,這種情況下被調函式必須要有返回值。
printf("%d",max(x,y)); /*把 max 呼叫的返回值作為 printf 函式的實參*/
-
-
在主調函式中呼叫某函式之前應對該被調函式進行宣告
宣告是什麼?
什麼是定義,什麼是宣告:
(一)定義:定義就是建立一個物件,分配一塊記憶體,並且賦予一個代號,即物件名或者變數名。
定義出來的物件有以下特點:
- 和所分配的記憶體死死連在一塊,記憶體地址和變數名字都不可以改變
- 一個物件或者變數,在一個區域內(全域性,檔案,函式,迴圈等)只能被定義一次,如果定義多次,編譯器會提示你重複定義同一個變數或物件。
(二)宣告:宣告就是告訴編輯器,這個變數或者物件已經和一塊記憶體相匹配,並且如果要使用這塊記憶體中的內容,就必須再次建立一個變數,這個變數就是在複製已經定義好的變數的內容。
造成這兩種區別的最關鍵問題是:記憶體,記憶體給物件分配了資源——記憶體,而宣告就是將於記憶體相關聯的物件進行使用和擴充套件。
宣告的一般形式:
型別說明符 被調函式名(型別 形參,型別 形參...);
三、變數的儲存型別
什麼是變數
在C語言中,變數就是對程式中資料所佔記憶體空間的一種抽象定義。
使用者在定義變數時會定義變數的名字、型別等變數的操作屬性。
系統可以根據變數名訪問變數,關鍵在於變數名確定了變數在系統記憶體中的位置,在計算機中,儲存變數當前值的儲存單元有兩類:
- 記憶體
- CPU 的寄存 器
而變數的儲存型別關係到變數的儲存位置,C 語言中定義了 4 種儲存屬性:
- 自動變數
- 外部變數
- 靜態變數
- 暫存器變數(它關係到變數在記憶體中的存放位置, 由此決定了變數的保留時間和變數的作用範圍)
【注】:
-
變數的保留時間又稱為生存期,從時間的角度,可將變數分為:
- 靜態儲存:指變數儲存在記憶體的靜態儲存區,在編譯時就分配了儲存空間,在整個程式的執行期間,該變數佔有 固定的儲存單元,程式結束後,這部分空間才釋放,變數的值在整個程式中始終存在;
- 動態儲存:指變數儲存在記憶體的動態儲存區,在程式的執行過程中,只有當變數所在的函式被呼叫時,編譯系統才臨時為該變數分配一段記憶體單元,函式呼叫結束,該變數空間釋放,變數的值只在函式呼叫期存在。
-
變數的作用範圍又稱為作用域,從空間角度,可以將變數分為
- 全域性變數:指全域性變數是**在函式之外定義的變數****,其作用範圍為從定義處開始到本檔案結束,**編 譯時,編譯系統為其分配固定的記憶體單元(即靜態儲存),在程式執行的自始至終都佔用固定單元
- 區域性變數:指在一 個函式或複合語句內定義的變數,它僅在函式或複合語句內有效,編譯時,編譯系統不為區域性變數分配內 存單元,而是在程式執行過程中,當局部變數所在的函式被呼叫時(即動態儲存),編譯系統根據需要,臨時分配記憶體, 呼叫結束,空間釋放。
自動變數
什麼是自動變數:
函式中的區域性變數,如不專門宣告為 static 儲存類別,都是動態地分配儲存空間的,資料儲存在動態 儲存區中。
函式中的形參和在**函式中定義的變數(**包括在複合語句中定義的變數)都屬此類,【在呼叫該函式時系統會給它們分配儲存空間,在函式呼叫結束時就自動釋放這些儲存空間】。這類區域性變數稱為自動變數。
自動變數用關鍵字 auto 進行儲存類別的宣告,例如宣告一個自動變數:
int fun(int a){auto int b,c=3;/*定義 b,c 為自動變數*/}
a 是函式 fun()的形參,b、c 是自動變數,並對 c 賦初值 3。執行完 fun()函式後,自動釋放 a、b、c 所佔的儲存單元。
外部變數
什麼是外部變數:
外部變數(即全域性變數)是在函式的外部定義的,它的作用域為從變數定義處開始,到本程式檔案的末尾。
如果外部變數不在檔案的開頭定義,其有效的作用範圍只限於定義處到檔案末尾。
如果在定義點之前的函式想引用該外部變數,則應該在引用之前用關鍵字 extern 對該變數進行“外部變數宣告”。表示該變數是一個已經定義的外部變數。有了此宣告,就可以從“宣告”處起,合法地使用該外部變數.
用 extern 宣告外部變數,擴充套件程式檔案中的作用域.
靜態變數
有時希望函式中的區域性變數的值在函式呼叫結束後不消失而保留原值,這時就應該指定區域性變數為靜態區域性變數,用關鍵字 static 進行宣告。
暫存器變數
為提高效率,C 語言允許將區域性變數的值存放在 CPU 的暫存器中,這種變數叫做暫存器變數,用關鍵字 register 宣告。使用暫存器變數需要注意以下幾點:
(1)只有區域性自動變數和形式引數可以作為暫存器變數。
(2)一個計算機系統中的暫存器數目有限,不能定義任意多個暫存器變數。
(3)不能使用取地址運算子“&”求暫存器變數的地址。