C函數的定義與調用


7.2.1 函數的定義
任何函數(包括主函數main())都是由函數說明和函數體兩部分組成。根據函數是否需要參數,可將函數分為無參函數和有參函數兩種。

  1. 無參函數的一般形式
    函數類型 函數名( )
    { 說明語句部分;
    可執行語句部分;
    }

  2. 有參函數的一般形式
    函數類型 函數名( 數據類型 參數1[,數據類型 參數2…] )
    { 說明語句部分;
    可執行語句部分;}

  3. 空函數的定義
    既無參數、函數體又為空的函數。其一般形式為:
    [函數類型] 函數名()
    { }
    說明:
    (1)函數類型:用於指定函數帶回來的值的類型,可以是任何有效類型。函數類型可以省略,則系統默認為int型,這時函數返回一個整數值。當函數無返回值時函數類型一般應寫成void,稱為無類型或空類型。
    (2)參數表:它是一個用逗號分隔的變量說明表,參數表中的參數稱為“形式參數”,簡稱“形參” 。形參用於主調函數和被調用函數之間進行數據傳遞,即當函數被調用時,形參接收實參傳過來的值。
    參數表的定義形式如下:
    類型標識符 形式參數1,類型標識符 形式參數2,……
    例如:float area(float a,float b,float c)
    (3)可以定義空函數,即形式參數和函數體均為空。調用此函數時,不做任何工作,只是表明這里需要調用一個函數。

  4. 函數返回值與return語句
    return語句的一般格式為:
    return ( 返回值表達式 );
    功能:返回調用函數,並將“返回值表達式”的值帶給調用函數。
    說明:
    (1)一個函數中可以有一個或多個return語句,當執行到某個return語句時,程序的控制流程將返回到主調函數,並將return語句中表達式的值作為函數值帶回。
    (2)若函數體內沒有return語句,則一直執行到函數體末尾的“}”為止,然后返回到主調函數,這時也會有一個不確定的值被帶回到主調函數。若不需要帶回函數值,一般可將函數定義為void類型。
    (3)return語句中表達式的類型應與函數類型一致,若不一致時,以函數類型為准。

  5. 函數類型
    函數類型與return語句返回值的類型一致。
    對被調用函數進行說明,其一般格式為:
    函數類型 函數名(數據類型[ 參數名1][, 數據類型[ 參數名2]…]);
    C語言規定,以下兩種情況,可以省去對被調用函數的說明:
    (1)當被調用函數的函數定義出現在調用函數之前時。因為在調用之前,編譯系統已經知道了被調用函數的函數類型、參數個數、類型和順序。
    (2)如果在所有函數定義之前,在函數外部(例如文件開始處)預先對各個函數進行了說明,則在調用函數中可缺省對被調用函數的說明。

1.函數調用
C語言中函數調用的一般形式為:
函數名([實際參數表])
注意:
實參的個數、類型和順序,應該與被調用函數所要求的參數個數、類型和順序一致,才能正確地進行數據傳遞。
2.函數調用方式
(1)函數表達式。函數作為表達式的一項,出現在表達式中,以函數返回值參與表達式的運算。這種方式要求函數是有返回值的。 例如:c=2*max(a,b);
(2)函數語句。C語言中的函數可以只進行某些操作而不返回函數值,這時的函數調用可作為一條獨立的語句。例如:max(a,b);
(3)函數實參。函數作為另一個函數調用的實際參數出現。這種情況是把該函數的返回值作為實參進行傳送,因此要求該函數必須是有返回值的。
例如:n=max(a,max(b,c));其中max(b,c)是一次調用,它的值作為max另一次調用的實參。
(4)調用時實參與形參在類型必須匹配。
函數的參數分為形參和實參兩種,作用是實現數據傳送。形參出現在函數定義中,只能在該函數體內使用。發生函數調用時,調用函數把實參的值復制1份,傳送給被調用函數的形參,從而實現調用函數向被調用函數的數據傳送。
關於形參與實參的說明:
(1)實參可以是常量、變量、表達式、函數等。無論實參是何種類型的量,在進行函數調用時,它們都必須具有確定的值,以便把這些值傳送給形參。
(2)形參變量只有在被調用時,才分配內存單元;調用結束時,即刻釋放所分配的內存單元。
(3)實參對形參的數據傳送是單向的,即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。
(4)實參和形參占用不同的內存單元,即使同名也互不影響。
7.3.1 函數的嵌套調用
函數的嵌套調用是指,在執行被調用函數時,被調用函數又調用了其他函數。其關系可表示如圖所示。
所謂函數的遞歸調用是指,一個函數在它的函數體內,直接或間接地調用它自身。遞歸調用分為直接遞歸調用和間接遞歸調用兩種,如圖所示。
7.4.1 數組元素作為函數參數
數組元素就是下標變量,與普通變量並無區別。數組元素只能用作函數實參,其用法與普通變量完全相同。在發生函數調用時,把數組元素的值傳送給形參,實現單向值傳送。
數組名作函數參數時,既可以作形參,也可以作實參。而且形參和相對應的實參都必須是類型相同的數組(或指向數組的指針變量),都必須有明確的數組說明。
7.5.1 局部變量
在一個函數內部或一個復合語句內定義的變量稱為局部變量,它只在本函數范圍或該復合語句內有效,即只有在本函數內或本復合語句內才能使用它們,離開該范圍是不能使用這些變量的。例如:
int f1(int a) /*函數f1*/
{ int b,c;

} /*a,b,c作用域:僅限於函數f1()中*/
int f2(int x) /*函數f2*/
{ int y,z;

} /*x,y,z作用域:僅限於函數f2()中*/
main()
{ int m,n;

} /*m,n作用域:僅限於函數main()中*/
在函數外部定義的變量,它的作用域是:從定義變量的位置開始,到本文件結束。外部變量可被作用域內的所有函數直接引用。
例如:
int x,y; /* 全局變量*/
float f1(int a)
{… }
float a,b; /* 全局變量*/
int f2(int c)
{ int z;

}
main()
{ int m,n;

}
C語言對變量的存儲類型說明有四種:自動變量(auto)、寄存器變量(register)、外部變量(extern)、靜態變量(static)。
7.6.1 靜態變量
定義格式: static 數據類型 變量表;
注意:
靜態變量屬於靜態存儲。在程序執行過程中,即使所在函數調用結束也不釋放。換句話說,在程序執行期間,靜態變量始終存在。
定義靜態變量但不初始化,則自動賦以"0"(整型和實型)或'\0'(字符型);且每次調用它們所在的函數時,不再重新賦初值,只是保留上次調用結束時的值。
當需要保留函數上一次調用結束時的值或者變量只被引用而不改變其值時,才使用靜態變量。
自動變量
定義格式:[auto] 數據類型 變量表;
注意:
自動變量屬於動態存儲方式。在函數中定義的自動變量,只在該函數內有效;函數被調用時分配存儲空間,調用結束就釋放。
在復合語句中定義的自動變量,只在該復合語句中有效;退出復合語句后,也不能再使用,否則將引起錯誤。
定義動態變量而不初始化,則其值是不確定的。如果初始化,則賦初值操作是在調用時進行的,且每次調用都要重新賦一次初值。
由於自動變量的作用域和生存期,都局限於定義它的個體內(函數或復合語句),因此不同的個體中允許使用同名的變量而不會混淆。即使在函數內定義的自動變量,也可與該函數內部的復合語句中定義的自動變量同名。
7.6.3 寄存器變量
一般情況下,變量的值都是存儲在內存中的。為提高執行效率,C語言允許將局部變量的值存放到寄存器中,這種變量就稱為寄存器變量。其定義格式為:
register 數據類型 變量表;
注意:
只有局部變量才能定義成寄存器變量,即全局變量不行。
允許使用的寄存器數目是有限的,不能定義任意多個寄存器變量。
7.6.4 外部變量
外部變量屬於靜態存儲方式。其定義格式為:
extern 數據類型 外部變量表;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM