「我們是傘兵,本來就該被包圍的!」----《兄弟連》。
在戰爭中,傘兵天生就該被包圍,而在程式語言中,函式生來就該被呼叫。在被呼叫的過程中,執行函式的指令,完成值和引數的傳遞。按照不同的傳遞方式,函式可以分為下面幾類:
1、先來看返回變數、常量的函式:
1 #include 2 #include 3上面的函式是返回變數的值,如果把被調函式func中的變數a換成常量,程式依然能夠得到正確結果。例如:4int func(inta)5
10int
main()
11
1 #include 2也許有人會問,辛辛苦苦敲了半天**,就返回了乙個字元,為什麼不返回乙個字串那?返回字串不是不行,可要返回字串,就不能按照返回一般的變數、常量來處理了。我們知道,在c語言程式設計環境下,字串只能用字元型陣列或者字元型指標來宣告和定義,不存在c++語言語言環境下的string型別。因此,當你要返回字串的時候,其實需要返回的是字串的位址。這就引出了我們的下乙個課題:3int
func()49
intmain()
10
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如果我們用vs2015以上編輯器執行上面**,控制台會輸出註解的內容。如果用codeblock或者其他編輯器執行,則有可能無任何輸出,因為你輸出的記憶體資料是無效的。綜合起來看,函式不能返回在被調函式中定義的區域性變數、陣列形式宣告的字串(字串陣列)。因為他們存放在棧上。隨著被調函式執行結束,這些區域性變數、字串等占用的記憶體被釋放。再訪問上述記憶體空間就是非法訪問了。那麼是不是函式就不能返回位址了那?不是!函式可以返回存放在程式資料區、堆區的位址(關於記憶體分割槽的內容參見:詳見下面例子:int*func()610
void
test01()
1117
18int
main()
19
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 該程式求最大值結果沒問題,但交換兩數有問題。形參 函式定義處 為普通形式 實參 函式呼叫處...