程式中的函式引數

沉舟道人發表於2024-05-26

程式中的函式引數

1、什麼是函式

C語言程式的基本單位是函式。而函式就是若干個語句構成的塊語句,用來單獨解決一個問題。由函式名、函式引數、函式返回值和函式的執行語句組成。

​ 其中函式引數是可選的,可以是void,也可以是引數列表,如下所示:

函式型別 函式名稱(引數1型別 引數1名稱,引數2型別 引數2名稱.........)

{

......

}

2、引數的選擇

​ 如果函式的引數列表為void,表示沒有傳遞的引數,此時如果在函式中需要用到引數,則需要在函式內部定義一個普通變數,或者定義一個全域性變數或者靜態區域性變數。

​ 如果函式引數列表中有定義引數,那麼要知道這個定義的引數只是一個函式的助記符, 只是為了描述需要傳遞給函式的引數,所以函式的引數一般稱為形式引數,簡稱為形參。而定義函式的時候函式引數列表中的形參是不佔記憶體的,只是為了提醒使用者引數的數量和型別!

​ 當一個函式被呼叫之後,函式的形參才會得到對應的記憶體,並且函式的形參的記憶體只會在函式內部生效,當函式呼叫完成後,則函式形參的記憶體會被系統自動釋放。

​ 所以在一個函式時就要考慮傳入的引數只是一個數值還是傳入一個地址,這個傳遞方式分別叫做單向傳遞和雙向傳遞。

  • 單向傳遞:只是把實參的值傳遞給函式作為引數,在函式內部對數值進行修改是不會影響外部實參的!
  • 雙向傳遞:把實慘的地址傳遞給函式作為引數,這樣函式內部就可以對地址中的資料進行修改,則函式外部的實參地址下的值也會變化。

那麼為什麼單向傳遞不會對實慘進行修改,而雙向傳遞會呢?

​ 首先,函式內定義的變數和函式引數都是區域性變數,區域性變數的記憶體在定義的時候由系統核心進行分配,在函式結束的時候核心也會自動釋放記憶體。
當函式傳入的是一個數值,核心會分配一塊記憶體空間,把傳入的值複製一份給它,函式內部則對這塊新的記憶體空間進行操作,而不會對實際引數的那塊記憶體改變。

​ 當函式傳入的是一個實參的地址,則核心也會分配一塊記憶體空間,複製一份引數的地址給他,相當於函式知道了實參的地址,函式中就可以透過 運算子( ***** )來間接訪問實慘並操作地址下的值。當函式結束的,核心分配的用來存放地址的空間被釋放,而實參對應的儲存空間已經被操作,而且被呼叫的函式結束並不會使得實參的空間被釋放,所以雙向傳遞能對實參進行修改。

​ 在實際應用中,當已經定義了一個全域性變數,值為0,若以它作為實參呼叫函式,函式就會用一個形參來接收它,而這個形參即使是與實參同名,他依然不是對之前的全域性變數,而只是個形參,當函式結束時,形參的記憶體釋放,全域性變數的值不會改變,依然還是0,這也是我編寫函式時把全域性變數和形參混淆了,導致出現錯誤的結果,希望大家注意細節,避免類似的錯誤。

總結:當編寫函式時,一定要考慮是否需要傳參,和傳入數值還是地址,這取決於你需不需要對傳入的引數進行修改。如果不需要修改,則傳入數值,如果需要修改,則可以傳入實參的地址,或者使用全域性變數,則不需要傳參,當然,在使用全域性變數時,也要考慮耦合性的問題,這些需要對特定問題特定解決,使用相對合適的方式

相關文章