按值传递与按地址传递

在调用一个有参数的过程时,首先进行的是形式参数与实在参数的结合,实现调用过程的实在参数与被调用过程的形式参数之间的数据传递。数据传递方式有两种方式:按值传递与按地址传递。

1. 按值传递参数

  按值传递参数时,是将实在参数的值复制一个形式参数中,如果在调用过程中改变了形式参数的值,不会影响实在参数本身,即实在参数保持调用前的值不变。

      按值传递参数方法是在形式参数前加上ByVal,如:Sub S1(ByVal a As Integer,ByVal b As integer) ;另外一些特别情况也是按值传递参数,如实在参数是常数、表达式时; 对于实在参数是变量时,只要在其左右加上圆括号,如  Call Sub1((x),(y))。

2.按地址传递参数

  按地址传递参数时,把实在参数的地址传送给被调用过程,形式参数和实在参数共用内存的同一地址。在被调用过程中,形式参数的值一旦改变,相应实参的值也跟着改变。

       按地址传递参数方法是在形式参数前加上ByRef,或形式参数前为空,如:Sub S1([ByRef] a As Integer,[ByRef] b As integer) ;形参数组只能按地址传递参数。

举例1

Private Sub Form_Click()
  Dim a As Integer, b As Integer
  a = 10: b = 25
  Call sub1(a, b)
  Print a, b
End Sub

Private Sub sub1(ByVal m As Integer, ByVal n As Integer)
  Dim temp As Integer
  temp = m
  m = n
  n = temp
  Print m, n, temp
End Sub

运行结果是:

在窗体第一行显示:25               10                10

在窗体第二行显示:10               25

见下图:

按值传递与按地址传递 - wuhua_csy - wuhua_csy的博客

  举例2

Private Sub Form_Click()
  Dim a As Integer, b As Integer
  a = 10: b = 25
  Call sub1(a, b)
  Print a, b
End Sub

Private Sub sub1(ByVal m As Integer, n As Integer)
  Dim temp As Integer
  temp = m
  m = n
  n = temp
  Print m, n, temp
End Sub

运行结果是:

在窗体第一行显示:25               10                10

在窗体第二行显示:10               10

见下图:

按值传递与按地址传递 - wuhua_csy - wuhua_csy的博客
  举例3

Private Sub Form_Click()
  Dim a As Integer, b As Integer
  a = 10: b = 25
  Call sub1(a, b)
  Print a, b
End Sub

Private Sub sub1(m As Integer, ByVal n As Integer)
  Dim temp As Integer
  temp = m
  m = n
  n = temp
  Print m, n, temp
End Sub
运行结果是:

在窗体第一行显示:25               10                10

在窗体第二行显示:25               25

见下图:

按值传递与按地址传递 - wuhua_csy - wuhua_csy的博客

  举例4

Private Sub Form_Click()
  Dim a As Integer, b As Integer
  a = 10: b = 25
  Call sub1(a, b)
  Print a, b
End Sub

Private Sub sub1(m As Integer, n As Integer)
  Dim temp As Integer
  temp = m
  m = n
  n = temp
  Print m, n, temp
End Sub
运行结果是:

在窗体第一行显示:25               10                10

在窗体第二行显示:25               10

见下图:

按值传递与按地址传递 - wuhua_csy - wuhua_csy的博客

举例5
Private Sub Form_Click()
  Dim a As Integer, b As Integer
  a = 20: b = 50
  p1 a, b
  p2 a, b
  p3 a, b
  Print "a="; a, "b="; b
End Sub

Private Sub p1(x As Integer, ByVal y As Integer)
  x = x + 10
  y = y + 20
End Sub

Private Sub p2(ByVal x As Integer, y As Integer)
  x = x + 10
  y = y + 20
End Sub

Private Sub p3(ByVal x As Integer, ByVal y As Integer)
  x = x + 10
  y = y + 20
End Sub

运行结果是:

在窗体上显示:a= 30     b=70

见下图:

按值传递与按地址传递 - wuhua_csy - wuhua_csy的博客
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
指针值传递地址传递是两种不同的概念。在C语言中,函数参数可以通过值传递地址传递传递给函数。 指针值传递是指将指针变量作为参数传递给函数,函数中对指针所指向的内存进行操作。这种方式下,函数内部对指针的修改不会影响到原始的指针变量。但是,函数中对指针所指向的内存的修改会影响到原始内存。 地址传递是指将变量的地址作为参数传递给函数。这种方式下,函数内部对地址所对应的变量进行操作,会直接影响到原始变量的值。通过地址传递,可以实现在函数内部对原始变量进行修改。 下面是一个示例代码,展示了指针值传递地址传递的区别: ```c #include <stdio.h> // 指针值传递 void pointerValuePass(int* ptr) { *ptr = 10; // 修改指针所指向的内存 ptr = NULL; // 修改指针本身不会影响原始指针 } // 地址传递 void addressPass(int* ptr) { *ptr = 20; // 修改地址对应的变量 ptr = NULL; // 修改指针本身不会影响原始指针 } int main() { int num = 0; int* ptr = &num; printf("Before pointerValuePass: num = %d\n", num); pointerValuePass(ptr); printf("After pointerValuePass: num = %d\n", num); printf("Before addressPass: num = %d\n", num); addressPass(&num); printf("After addressPass: num = %d\n", num); return 0; } ``` 输出结果为: ``` Before pointerValuePass: num = 0 After pointerValuePass: num = 10 Before addressPass: num = 10 After addressPass: num = 20 ``` 可以看到,指针值传递修改了指针所指向的内存,但没有修改原始指针的值;而地址传递直接修改了原始变量的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值