博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FORM值传递与地址传递
阅读量:5024 次
发布时间:2019-06-12

本文共 3352 字,大约阅读时间需要 11 分钟。

DATA:i TYPE i VALUE 100.

WRITE: / 'frm_ref========'.
PERFORM frm_ref USING i.
WRITE: / i."200

WRITE: / 'frm_val========'.

i = 100.
PERFORM frm_val USING i.
WRITE: / i."100

WRITE: / 'frm_ref2======='.

"不能将下面的变量定义到frm_ref2过程中,如果这样,下面的dref指针在调用frm_ref2 后,
"指向的是Form中局部变量内存,为不安全发布,运行会抛异常,因为From结束后,它所拥有的所有变量内存空间会释放掉
DATA:i_frm_ref2 TYPE i VALUE 400.
i = 100.
DATA:dref TYPE REF TO i.
GET REFERENCE OF i INTO dref.
PERFORM frm_ref2 USING dref."传递的内容为地址,属于别名引用传递
WRITE: / i. "4000

FIELD-SYMBOLS : <fs> TYPE i .

ASSIGN dref->* TO <fs>."由于frm_ref2过程中已修改了dref的指向,现指向了i_frm_ref2 变量的内存空间
WRITE: / <fs>."400

WRITE: / 'frm_val2===='.

i = 100.
DATA: dref2 TYPE REF TO i .
GET REFERENCE OF i INTO dref2.
PERFORM frm_val2 USING dref2 .
WRITE: / i. "4000
ASSIGN dref2->* TO <fs>.
WRITE: / <fs>. "4000

*&---------------------------------------------------------------------*

*& Form frm_ref
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_I text
*----------------------------------------------------------------------*
FORM frm_ref USING p_i TYPE i ."C++中的引用参数传递:p_i为实参i的别名
WRITE: / p_i."100
p_i = 200."p_i为参数i的别名,所以可以直接修改实参
ENDFORM. "frm_ref

*&---------------------------------------------------------------------*

*& Form frm_val
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->VALUE(P_I) text
*----------------------------------------------------------------------*
FORM frm_val USING value(p_i)."传值:p_i为实参i的拷贝
WRITE: / p_i."100
p_i = 300."由于是传值,所以不会修改主调程序中的实参的值
ENDFORM. "frm_val
*&---------------------------------------------------------------------*
*& Form frm_ref2
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_I text
*----------------------------------------------------------------------*
FORM frm_ref2 USING p_i TYPE REF TO i ."p_i为实参dref的别名,类似C++中的引用参数传递(传递的内容为地址,并且属于别名引用传递)
FIELD-SYMBOLS : <fs> TYPE i .
"现在<fs>就是实参所指向的内存内容的别名,代表实参所指向的实际内容
ASSIGN p_i->* TO <fs>.
WRITE: / <fs>."100
<fs> = 4000."直接修改实参所指向的实际内存

DATA: dref TYPE REF TO i .
GET REFERENCE OF i_frm_ref2 INTO dref.
"由于USING为C++的引用参数,所以这里修改的直接是实参所存储的地址内容,这里的p_i为传进来的dref的别名,是同一个变量,所以实参的指向也发生了改变(这与Java中传递引用是不一样的,Java中传递引用时为地址的拷贝,即Java中永远也只有传值,但C/C++/ABAP中可以传递真正引用——别名)
p_i = dref."此处会修改实参的指向
ENDFORM. "frm_ref2

*&---------------------------------------------------------------------*

*& Form frm_val2
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->VALUE(P_I) text
*----------------------------------------------------------------------*
FORM frm_val2 USING value(p_i) TYPE REF TO i ."p_i为实参dref2的拷贝,类似Java中的引用传递(虽然传递的内容为地址,但传递的方式属于地址拷贝——值传递)
FIELD-SYMBOLS : <fs> TYPE i .
"现在<fs>就是实参所指向的内存内容的别名,代表实参所指向的实际内容
ASSIGN p_i->* TO <fs>.
WRITE: / <fs>."100
<fs> = 4000."但这里还是可以直接修改实参所指向的实际内容

DATA: dref TYPE REF TO i .
GET REFERENCE OF i_frm_ref2 INTO dref.
"这里与过程 frm_ref2 不一样,该过程 frm_val2 参数的传递方式与java中的引用传递是原理是一样的:传递的是地址拷贝,所以下面不会修改主调程序中实参dref2的指向,它所改变的只是拷贝过来的Form中局部形式参数的指向
p_i = dref.
ENDFORM. "frm_val2

 

转载于:https://www.cnblogs.com/zxiu/p/7390526.html

你可能感兴趣的文章
C#调用斑马打印机打印条码标签(支持COM、LPT、USB、TCP连接方式和ZPL、EPL、CPCL指令)【转】...
查看>>
关于git的认证方式
查看>>
字符串按照字典序排列
查看>>
IOS 开发调用打电话,发短信
查看>>
CI 框架中的日志处理 以及 404异常处理
查看>>
keepalived介绍
查看>>
css3 标签 background-size
查看>>
python itertools
查看>>
Linux内核调试技术——jprobe使用与实现
查看>>
样式、格式布局
查看>>
ubuntu设计文件权限
查看>>
Vue双向绑定原理详解
查看>>
Android基础总结(5)——数据存储,持久化技术
查看>>
关于DataSet事务处理以及SqlDataAdapter四种用法
查看>>
bootstrap
查看>>
http://lorempixel.com/ 可以快速产生假图
查看>>
工程经验总结之吹水"管理大境界"
查看>>
为什么JS动态生成的input标签在后台有时候没法获取到
查看>>
20189210 移动开发平台第六周作业
查看>>
java之hibernate之基于外键的双向一对一关联映射
查看>>