引用傳遞
總結在學習嚴蔚敏《資料結構(c語言版)》的過程中,在書本給出的函式原型上,見到了一從來沒有見過的函式引數傳遞方式initlist(&l)
,並且會被c語言編譯器報錯,將源**字尾名改為.cpp後即可正常編譯,經查詢資料和實驗,總結出以下c/c++中函式引數的不同傳遞方法和性質。
理論上,可以將c語言中的引數傳遞方式都稱為值傳遞。值傳遞,故名思意,傳遞的是引數的值,而不是引數本身。例如:
int
main()
對於該主函式來說,定義a,b的過程,實際上分配了兩個4位元組(int型變數)的儲存空間,分別名為為a和b的,並將其賦值為1和2。接下來,分別編寫不同的swap函式,來驗證他們的不同之處。
void
swap
(int x,
int y)
//將a,b的值傳遞給函式
使用swap(a, b);
呼叫該函式時,只是單純的將a和b的值傳遞給x和y,可以將x和y理解為是a和b的副本。從本質上說,x,y是區域性變數,在呼叫函式時,函式實際上會在棧中分配兩個臨時的的空間,並命名為x和y,區域性變數僅存在於函式執行的過程中,當函式返回後,分配的空間就會被釋放。
在呼叫函式的過程中,還會把傳入的引數的值賦給該區域性變數。在本例中,就是將a的值1賦給x,將b的值2賦給y。在函式執行的過程中,實際上處理的都是x和y,而不會改變a和b的值(x,y和a,b分別儲存在不同的位址空間中)。
執行結果應當為:
before a = 1 b = 2after a = 1 b = 2
void
swap
(int
*x,int
*y)//將a,b的位址傳遞給函式
這是初學c語言時,所學習的引用傳遞,但是,從本質上來講,這仍然是值傳遞。鑑於陣列的引用本質上就是指標,所以不多加以討論。
使用swap(&a, &b);
呼叫該函式時,實際上是將a和b儲存空間的位址傳遞給區域性變數x和y,也就是說,此時,名為x的臨時空間中儲存的是a的位址,而函式中的*x
則是指標x所指向的位置的變數,也就是a,因此可以通過改變*x的值來改變a的值,對於y來說也是如此。
執行結果應當為:
before a = 1 b = 2但這並不代表傳遞指標就可以改變變數的值。就拿上面的例子來說,傳入的引數兩個都是指標,假如函式中有乙個命令after a = 2 b = 1
x = y;
,執行後將會使x的值為b的位址,也就是說,此時的x是指向b的指標。但是在這種情況下,顯然a的值和a的位址都不會有任何改變,因此,在c中的所有引數傳遞方式都是值傳遞。
注:僅考慮通過函式傳遞引數,不考慮全域性變數等情況。
void
swap
(int
&x,int
&y)//將a,b引用傳遞給函式
在c++中,還提供了一種特殊的引數引用方式,稱之為引用傳遞,通過引用傳遞,可以在函式中改變引數原本的值。
使用swap(a, b);
呼叫該函式時,並沒有產生新的臨時變數,而是將引數本身傳遞給了函式,x和y可以理解為a和b的別名,它們共享同乙個儲存空間。也就是說,對於x和a來說,無論它們的值,還是他們的位址,都是相同的。在函式中改變x的值,實際上就是對a進行相同的操作,因此,a和b的值會被函式所改變。
執行結果應當為:
before a = 1 b = 2對於c來說,函式引用引數的方法僅有值傳遞,無法改變傳入變數的值。如果函式需要改變多個變數的值,則需要間接的值傳遞,及將變數的位址傳遞給函式,通過取址運算子*的作用來間接改變變數的值。after a = 2 b = 1
而對於c++來說,在c的基礎上,還提供了引用傳遞,可以通過給變數賦予別名的方式,直接改變引用變數的值。
補充:指標傳遞和引用傳遞辨析
int a =1;
int*x =
&a;//指標傳遞,x為指向a的指標
int&x = a;
//引用傳遞,x為a的別名
值傳遞和引用傳遞
幾乎每種語言都有值傳遞和引用傳遞.下面是我的一些曲解,只講現象,不涉及到任何的原理,主要是鬧著玩的.a 新交了個女朋友b.有一天他女朋友b看見a在吃冰激凌,b想吃,但是a是個 座有點小潔癖,不想讓b吃,於是給b買了個新的冰激凌說你吃這個吧,別碰我嘴裡這個.這就是值傳遞.a和b的值沒有任何關係,他們一...
值傳遞和引用傳遞
1.什麼是值傳遞和引用傳遞 值傳遞 方法呼叫時,實際引數的值copy乙份傳遞給形式引數,此時,有兩個相等的數值分別儲存於不同的記憶體位址上,因此,後面的方法中都是對形參位址上的數值進行修改。引用傳遞 方法呼叫時,實際引數的值 也就是位址 copy乙份傳遞給形式引數,此時,形參和實參的引用都指向同一儲...
值傳遞和引用傳遞
定義 通過建立乙個實際引數的副本,再傳遞給方法的形式引數,在main自身並不會被使用。這個在我們第一次使用編寫交換數的方法時,基本都會遇見,當我呼叫a,b兩個變數時,通過交換方法交換他們的位置,但是沒用,這就是值傳遞,乙個坑 public class switchnum switchnum a,b ...