當前位置:編程學習大全網 - 編程語言 - 什麽是按值傳遞,什麽是按地址傳遞?

什麽是按值傳遞,什麽是按地址傳遞?

按值傳遞:在過程被調用時,傳遞給形參的是調用過程中的相應實參的值,形參與實參各占有不同位置的儲存空間,被調用過程在執行過程中,改變了形參變量的值,但不會調用過程的實參值。

按地址傳遞:就是當調用壹個過程時,是把實參變量的內存地址傳遞給被調用過程的形參,也就是說形參與實參使用相同地址的內存單元。因此當在被調用過程中改變形參的值,就等於改變了實參的值。

PS:其實我個人認為就像兩個小孩,都有自己的家,按值傳遞的就像是壹個小孩去另壹個小孩家玩,玩壹段時間還是要回自己各自的家,而他們倆的家卻沒啥聯系,壹點沒變,還在那呢?而按地址傳遞呢,就像是假如其中壹個小孩的家發大水啦,然後這個小孩無家可歸了,於是被另外壹個小孩家收留了,這個小孩帶著自己東西去那個小孩家,這時兩個小孩擁有的是相同的壹個家,他們倆就有聯系了,因為那個小孩的家換成另外壹個了.(不知道舉得例子是否恰當)

指針相信學習編程的人都知道吧,那麽看看下面的例子

按值傳遞時,實質上實參a只是把壹個副本傳遞給形參x,也可以直接理解為傳遞的結果是讓x*2中的x的值等於10(即a的值),乘以2後再賦值(賦值不用解釋吧)給x,即實際上w方法的運算並沒有對a本身進行操作。所以調用w方法前後a值始終等於10,而w方法得到的結果是20。

按址傳遞時,實質上實參a是把指針(地址)傳遞給形參x,這個指針指向的地址的值即是10,此時a與x分別有壹個指針同時指向10所在地址,即實際上w方法對a本身直接進行了操作(a自身參與運算)。所以調用w方法前後a值分別等於10和20,而w方法得到的結果是依然是20。

在比如拿VB中的例子來說

按地址傳遞

[plain] view plain copy print?

Functionfun(x?As?Integer,?y?As?Integer)?As?Integer?

x?=?x?*?y?

If?x<>?0?Then?

fun?=?x?

Else?

fun?=?y?

End?If?

EndFunction?

Private?SubCommand1_Click()?

Dim?a?AsInteger,?b?As?Integer?

a?=?2?

b?=?3?

Text1.Text?=?fun(a,?b)?

Text2.Text?=?fun(a,?b)?

Text3.Text?=?fun(a,?b)?

Text4.Text?=?fun(a,?b)?

End?Sub?

Functionfun(x As Integer, y As Integer) As Integer x = x * y If x<> 0 Then fun = x Else fun = y End If EndFunction Private SubCommand1_Click() Dim a AsInteger, b As Integer a = 2 ?b = 3 ?Text1.Text = fun(a, b) ?Text2.Text = fun(a, b) ?Text3.Text = fun(a, b) ?Text4.Text = fun(a, b) End Sub

下面是運行的結果,通過結果可以看出,這個是按值傳遞的, 每壹次運算後a的值都在變化。

按值傳遞

[plain] view plain copy print?

Subtext(ByVal?x?As?Integer,?ByVal?y?As?Integer)?

x?=?x?*?5?

y?=?y?/?5?

Print"x=";?x,?"y=?";?y?

End?Sub?

Private?SubCommand1_Click()?

Dim?a?AsInteger,?b?As?Integer?

a?=?10?

b?=?90?

text?a,?b?

Print"a=";?a,?"b=";?b?

End?Sub?

Subtext(ByVal x As Integer, ByVal y As Integer) x = x * 5 y = y / 5 Print"x="; x, "y= "; y End Sub Private SubCommand1_Click() Dim a AsInteger, b As Integer a = 10 b = 90 text a, b Print"a="; a, "b="; b End Sub

由運行結果可以看出,盡管x,y的值經過運算後發生了變化,但是a,b的值仍然沒有改變,這就是按值傳遞的小例子,就像上面圖解的那樣,傳遞過去的只是壹個副本,而本身沒有發生任何變化

通過例子的觀察和理解相信不懂參數傳遞的妳也會和我壹樣理解了吧

  • 上一篇:求問什麽是ESD(緊急停車系統)
  • 下一篇:簡述面向對象三大特征的理解
  • copyright 2024編程學習大全網