C C 中的引用傳遞和值傳遞

2021-10-04 13:25:44 字數 2185 閱讀 6143

引用傳遞

總結在學習嚴蔚敏《資料結構(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 = 2

after 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

after a = 2 b = 1

對於c來說,函式引用引數的方法僅有值傳遞,無法改變傳入變數的值。如果函式需要改變多個變數的值,則需要間接的值傳遞,及將變數的位址傳遞給函式,通過取址運算子*的作用來間接改變變數的值。

而對於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 ...