call by value ;call by address/reference ;call by name;call by pointer
来源:互联网 发布:java二维码生成代码 编辑:程序博客网 时间:2024/05/07 16:35
假设有一段code内容大致如下:
----------------------------------
MAIN()
BEGIN
A[1:4]={1,2,3,4};
X = 1;
Y = 2;
CALL SUB(X, Y, A[X]);
END
SUB(A, B, C)
BEGIN
A = B;
C = 12;
END
----------------------------------
call by value 方式:
调用时子程序得到的是参数值的副本,子程序中对形参的改变其实只是影响了该副本的值,但在返回主程序后该副本会被丢弃,因此在主程序中按值调用的参数仍保持原来的值。
例如SUB(A,B,C)中,若形参A是by value的,则在MAIN中CALL SUB(X,Y,A[X])后,X仍为1。
call by address/reference 方式:
调用时子程序得到的是实际参数的内存地址,因此在子程序中改变形参的值时,实际会导致对该形参所对应的地址处的内存数据的变化,即直接修改的是主程序中的变量的值,返回主程序后该参数所对应的变量值会产生变化。
例如SUB(A,B,C)中,若形参A是by reference的,则在MAIN中CALL SUB(X,Y,A[X])后,X会变为2。
call by name 方式:
有点类似于宏扩展的方式,调用的参数并非是在调用前计算出来,而是在子程序中每个引用所对应的形参的地方都重新进行计算,因此有延迟计算的作用。例如你例子中,若主程序调用SUB时是by name的,则实际执行的情况是:
A=B --> X=Y --> X=2
C=12 --> A[X]=12 --> A[2]=12
----------------------------------
MAIN()
BEGIN
A[1:4]={1,2,3,4};
X = 1;
Y = 2;
CALL SUB(X, Y, A[X]);
END
SUB(A, B, C)
BEGIN
A = B;
C = 12;
END
----------------------------------
call by value 方式:
调用时子程序得到的是参数值的副本,子程序中对形参的改变其实只是影响了该副本的值,但在返回主程序后该副本会被丢弃,因此在主程序中按值调用的参数仍保持原来的值。
例如SUB(A,B,C)中,若形参A是by value的,则在MAIN中CALL SUB(X,Y,A[X])后,X仍为1。
call by address/reference 方式:
调用时子程序得到的是实际参数的内存地址,因此在子程序中改变形参的值时,实际会导致对该形参所对应的地址处的内存数据的变化,即直接修改的是主程序中的变量的值,返回主程序后该参数所对应的变量值会产生变化。
例如SUB(A,B,C)中,若形参A是by reference的,则在MAIN中CALL SUB(X,Y,A[X])后,X会变为2。
call by name 方式:
有点类似于宏扩展的方式,调用的参数并非是在调用前计算出来,而是在子程序中每个引用所对应的形参的地方都重新进行计算,因此有延迟计算的作用。例如你例子中,若主程序调用SUB时是by name的,则实际执行的情况是:
A=B --> X=Y --> X=2
C=12 --> A[X]=12 --> A[2]=12
这里就看到,因为X的值先变化过,所以在对C赋值的时候,实际影响的是A[2],而不是A[1]。
call by pointer 方式:
以这种方式传递的参数同样也不会建立对象的复本,如果以对象的产生、呼叫的成本考虑,传参考与传指标是十分类似。
但传指标与传参考最大的分别是,参考是常数,而指针是变量。
因此这个指针可以指向另一个位置,另一个更明显的分别是所有的数组传递都是以传指标的方式达成。
可以用来传递单一对象或一个数组。
- call by value ;call by address/reference ;call by name;call by pointer
- Call by value Call by pointer Call by reference
- Call-by-reference and Call-by-value
- Call by value VS. Call by reference.
- call by value 和 call by reference
- call by value 和call by reference
- call by value 和 call by reference
- call by value / call by reference
- Call by Name, Call by Value
- Call By Name And Call By Value
- call by value or reference ?
- call by value or reference
- call by value or reference
- call by value or reference
- call by value or reference
- call by value 与call by reference的区别
- 实例浅析javascript call by value与call by reference
- call by value 和 call by reference的区别
- 来电归属、来电隐身?你归隐吧!
- android viewflipper 左右滑动切换显示图片效果
- 谁知道在openswan 网关对网关,中间有NAT设备下,这是什么问题呀?
- Google检索技巧
- (转)red5视频聊天源码
- call by value ;call by address/reference ;call by name;call by pointer
- Db2的常用命令和导入导出
- 网络数据安全信息加密
- Android启动画面
- NaN值与isNaN()函数 js 是否数字判断
- window.open()支持环境:
- 构造函数中无法实现多态
- 浅析C#中new、override、virtual关键字的区别
- 别具光芒CSS+div 学习一