FORM值传递与地址传递

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

 

posted @ 2017-08-18 16:39  独吊东南枝  阅读(432)  评论(0编辑  收藏  举报