【C語言】函式的概念和函式的呼叫(引數傳遞)

Jacky_Feng發表於2020-10-04

文章目錄

一、函式的定義

二、引數傳遞

1.引數

2.傳遞引數的方式

3.函式呼叫


一、函式的定義

在C語言中,最基礎的程式模組是函式。函式被視為程式中基本的邏輯單位,一個C程式是由一個main()函式和若干普通函式組成。

定義一個函式的語法格式如下:

返回值型別    函式名([引數型別1  引數名1],[引數型別2  引數名2],[引數型別3  引數名3]...)

{

    函式體

   ......

    return 返回值;
}

函式主要包含:返回值型別、函式名、引數型別、引數、函式體、返回值

各部分解析:

  • 返回值型別:用於限定函式返回值型別,當返回型別為void時,return語句可以省略。
  • 函式名:表示函式的名稱。
  • 引數型別:用於限定呼叫函式時傳入函式中的資料型別。
  • 引數:用於接收傳入函式的資料
  • return關鍵字:用於結束函式,將函式的返回值返回函式呼叫處。

【注意】

 如果函式不需要返回值,則函式的返回值型別應被定義為void,函式的返回值就可以省略。

[引數型別1  引數名1],[引數型別2  引數名2],[引數型別3  引數名3]...稱為引數列表,如果函式不需要接收引數,引數列表為空,此時函式稱為無參函式


二、引數傳遞

1.引數

程式在編譯或執行時,使用某個函式來完成相關功能,稱之為函式呼叫。函式在被呼叫時,可以通過函式的引數列表,進行資料傳遞。函式中的引數有兩種,分別為形式引數實際引數

(1)形式引數

在定義函式時,函式名後括號中的變數名稱為形式引數或虛擬引數,簡稱“形參”。例如下面函式宣告語句:

int func(int a,int b);

變數a和b就是形式引數,這樣的形參並不佔用實際記憶體,僅為了標識函式的引數列表而存在。 

(2)實際引數

在函式被呼叫時,函式名後小括號內的引數稱為實際引數,簡稱“實參”。實參可以是常量、變數、表示式。例如以下呼叫語句:

func(3,5);

此行程式碼是對函式func的呼叫,資料‘3’和‘5’分別對應引數列表a和b。當函式被呼叫時,形參是真正的變數,佔用記憶體空間,此時具體的資料“3”和“5”就被傳遞給函式引數列表中的變數a和b。在函式呼叫時,形參獲取實參的資料(相當於進行了賦值),該資料在本次函式呼叫時有效,一旦呼叫的函式執行完畢,形參的值就會被釋放。

【注意】形參和實參的資料傳遞是單向的,只能是由實參傳遞給形參,不能由形參傳遞給實參。 

2.傳遞引數的方式

傳遞引數的方式有:按值傳遞按引用傳遞兩種(值傳遞和地址傳遞

  • 按值傳遞實參時,程式會將實參建立一個副本,將這個副本傳遞給被調函式。對這個副本的修改不會影響到主調函式中原來引數變數的值。
  • 按引用傳遞實參時,主調函式則會允許被調函式修改相應的實參變數的值。

若被調函式不需要修改主調函式中實參變數的值,則應採用按值傳遞的方式。這樣可以防止意外的副作用(變數被修改)。

只有在被調函式需要修改主調函式中的變數而這個被調函式又是可信任的時候,才可以使用按引用傳遞。

【注意】C語言中,所有的實參都是按值傳遞。如果被傳遞的引數是一個陣列名,並且在函式中使用下標引用該陣列的引數,那麼在函式中對陣列元素進行修改實際上修改的是呼叫程式中的陣列元素。函式將訪問呼叫程式的陣列元素,陣列並不會被複制。這就是按引用傳遞,也就是“傳址呼叫”。

陣列的這一行為看似與按值傳遞規則相悖。但其實並不矛盾——陣列名實際上是一個指標,傳遞給函式的是這個指標對一個副本。下標引用實際上是間接訪問的另一種形式,這個副本上執行間接訪問的是原先的陣列。

3.函式呼叫

(1)主函式呼叫普通函式

(2)巢狀呼叫

(3)遞迴呼叫:函式呼叫自身。

主函式可以呼叫普通函式,普通函式可以相互呼叫,但不能呼叫主函式。

當呼叫一個函式時,需要明確函式名和實參列表。要求實參和形參必須滿足三個條件:引數個數相等、順序對應、型別匹配

相關文章