DATA:i TYPE i VALUE 100.
WRITE: / 'frm_ref========'.PERFORM frm_ref USING i.WRITE: / i."200WRITE: / 'frm_val========'.
i = 100.PERFORM frm_val USING i.WRITE: / i."100WRITE: / '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. "4000FIELD-SYMBOLS : <fs> TYPE i .
ASSIGN dref->* TO <fs>."由于frm_ref2过程中已修改了dref的指向,现指向了i_frm_ref2 变量的内存空间WRITE: / <fs>."400WRITE: / 'frm_val2===='.
i = 100.DATA: dref2 TYPE REF TO i .GET REFERENCE OF i INTO dref2.PERFORM frm_val2 USING dref2 .WRITE: / i. "4000ASSIGN 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