C語言函式間引數的傳遞方式(一)有返回的函式

2022-05-17 21:13:14 字數 1607 閱讀 4176

「我們是傘兵,本來就該被包圍的!」----《兄弟連》。

在戰爭中,傘兵天生就該被包圍,而在程式語言中,函式生來就該被呼叫。在被呼叫的過程中,執行函式的指令,完成值和引數的傳遞。按照不同的傳遞方式,函式可以分為下面幾類:

1、先來看返回變數、常量的函式:

1 #include 2 #include 3

4int func(inta)5

10int

main()

11

上面的函式是返回變數的值,如果把被調函式func中的變數a換成常量,程式依然能夠得到正確結果。例如:

1 #include 2

3int

func()49

intmain()

10

也許有人會問,辛辛苦苦敲了半天**,就返回了乙個字元,為什麼不返回乙個字串那?返回字串不是不行,可要返回字串,就不能按照返回一般的變數、常量來處理了。我們知道,在c語言程式設計環境下,字串只能用字元型陣列或者字元型指標來宣告和定義,不存在c++語言語言環境下的string型別。因此,當你要返回字串的時候,其實需要返回的是字串的位址。這就引出了我們的下乙個課題:

2、返回字串位址

1 #include 2 #include 3 #include 45

char*getstring()610

void

test02()

11

1819

intmain()

20

執行程式,我們會發現,字串陣列沒有被正確輸出。下面再看一例:

3、區域性變數位址的返回

1 #include 2 #include 3 #include 45

int*func()610

void

test01()

1117

18int

main()

19

如果我們用vs2015以上編輯器執行上面**,控制台會輸出註解的內容。如果用codeblock或者其他編輯器執行,則有可能無任何輸出,因為你輸出的記憶體資料是無效的。綜合起來看,函式不能返回在被調函式中定義的區域性變數、陣列形式宣告的字串(字串陣列)。因為他們存放在棧上。隨著被調函式執行結束,這些區域性變數、字串等占用的記憶體被釋放。再訪問上述記憶體空間就是非法訪問了。那麼是不是函式就不能返回位址了那?不是!函式可以返回存放在程式資料區、堆區的位址(關於記憶體分割槽的內容參見:詳見下面例子:

4、堆及程式資料區位址的返回

1 #include 2 #include 3 #include 45

char*getstring01()612

void

test02()

13

1819

char*getstring02()

2024

void

test03()

2530

intmain()

31

通過上面的例子可以看出,我們能返回程式資料區、堆區變數、常量的位址,但不能返回棧區的變數、常量的位址。

C 函式傳遞引數的方式有哪些?

c 函式傳遞引數的方式有以下四種 1 值傳遞 當進行值傳遞時,就是將實參的值複製到形參中,而形參和實參不是同乙個儲存單元,所以函式呼叫結束後,實參的值不會發生改變。2 指標傳遞 當進行指標傳遞時,形參是指標變數,實參是乙個變數的位址,呼叫函式時,形參 指標變數 指向實參變數單元。這種方式還是 值傳遞...

C 函式引數傳遞方式

引數傳遞有三種方式 值傳遞 pass by value 指標傳遞 pass by pointer 引用傳遞 pass by reference 程式測試 include stdafx.h include using namespace std 值傳遞 pass by value void fun1 ...

c 函式引數的傳遞方式

2.引用作為函式引數傳遞 3 總結 4 參考文獻 值傳遞 單向傳遞 實參傳遞給形參 而形參的值無法傳遞給實參 int max int a,int b int swap int a,int b int main 該程式求最大值結果沒問題,但交換兩數有問題。形參 函式定義處 為普通形式 實參 函式呼叫處...