首先,先翻译一下SAP对引用变量->*的解释如下:
If you specify a data reference dref for a mem_area that was dereferenced using the dereferencing operator ->*,
the storage area of the data object is assigned to the field symbol.
如果你为内存区域指定也给数据引用DREF,那么解除引用使用解引用运算符->*,数据对象的存储区域将分配到字段符号。
The data object concerned is the one to which dref points. If the reference variable dref does not reference any data object,
the assignment is not carried out and sy-subrc is set to 4.
有关的数据对象是一个到DREF的指针。如果参照变量dref不引用任何数据对象,那个分配将不能执行并且SY-SUBRC设置成4.
In contrast to all the other operand positions where the specification of dref->* is only possible as of Release 6.10 and the data reference dref must be fully typed,
the specification of dref->* was already possible with Release 4.6 in the statement ASSIGN.
在对比所有其他运算数位置,那个规格DREF->*是仅可能作为发布6.10并且数据引用dref必须完全匹配。DREF-> *规格已经在发行版4.6中声明分配。
In the statement ASSIGN, dref can be typed generically using TYPE REF TO data.
Furthermore, the data referencing of a data reference that does not point to any data object does not cause an exception that cannot be handled, but only in the statement ASSIGN.
对于声明ASSIGN,dref可以使用TYPE REF TO data去进行一般定义。
此外,引用的数据参考不指向任何数据对象不会引起无法处理的异常,但是仅仅在声明ASSIGN。
Since Release 6.10, dref->* can also be specified in the dynamic variants mentioned as a field content,
and after dref->* it is possible to enter offset or length specifications - if dref is completely typed.
自从6.10发布版本,dref->*也能够作为一个字段内容在动态变量方法中被确定。
随后dref->* 它可以输入偏移量或长度规格-当dref是完全定义。
TYPES:
BEGIN OF T_STRUCT,
COL1 TYPE I,
COL2 TYPE I,
END OF T_STRUCT.
DATA:
DREF1 TYPE REF TO DATA,
DREF2 TYPE REF TO DATA,
DREF3 TYPE REF TO DATA.
FIELD-SYMBOLS:
<FS1> TYPE T_STRUCT,
<FS2> TYPE I,
<FS3> TYPE T_STRUCT,
<FS4> TYPE T_STRUCT,
<FS5> TYPE T_STRUCT,
<FS6> TYPE T_STRUCT.
CREATE DATA DREF1 TYPE T_STRUCT.
WRITE ‘<1> 引用变量给字段符号<FS1>赋值输出’.
SKIP.
IF DREF1 IS BOUND.
ASSIGN DREF1->* TO <FS1>.
<FS1>-COL1 = 1.
<FS1>-COL2 = 2 .
WRITE:
<FS1>-COL1,
<FS1>-COL2.
SKIP.
WRITE ‘<2> 引用变量给字段符号<FS3>赋值输出’.
SKIP.
ASSIGN DREF1->* TO <FS3>.
WRITE:
<FS3>-COL1,
<FS3>-COL2.
SKIP.
WRITE ‘ 引用变量给字段符号赋值结束后,没有释放地址!’.
SKIP.
WRITE ‘<3> 引用变量之间是地址赋值,仍然可以输出值’.
DREF2 = DREF1.
ASSIGN DREF2->* TO <FS4>.
SKIP.
WRITE:
<FS4>-COL1,
<FS4>-COL2.
SKIP.
WRITE ‘<4> 改变字段符号中字段值,把地址赋给引用变量DREF1后,’.
SKIP.
WRITE ‘ 引用变量DREF1通过字段符号<FS5>可以看到数据改变.’.
<FS4>-COL1 = 8.
<FS4>-COL2 = 9.
GET REFERENCE OF <FS4> INTO DREF1.
ASSIGN DREF1->* TO <FS5>.
SKIP.
WRITE:
<FS5>-COL1,
<FS5>-COL2.
SKIP.
WRITE ‘<5> 引用变量进行强制类型装换,若不加CASTING会输出short down.’.
ASSIGN DREF2->* TO <FS2> CASTING.
WRITE / <FS2>.
SKIP.
WRITE ‘<6> 解除字段符号,释放内存以及数据.’.
UNASSIGN <FS2>.
* WRITE / <FS2>.
SKIP.
WRITE ‘当输出WRITE / <FS2>时会出现short down’.
SKIP.
WRITE ‘<7> 解除引用变量,释放内存以及数据.’.
CLEAR DREF2.
ASSIGN DREF2->* TO <FS6>.
SKIP.
WRITE ‘当输出WRITE /<FS6>-COL1,<FS6>-COL2.时会出现short down’.
* WRITE:
* <FS6>-COL1,
* <FS6>-COL2.
ENDIF.
程序输出界面如下:

abap引用变量分析
通过SAP帮助中的解释“如果你为内存区域指定也给数据引用DREF,那么解除引用使用解引用运算符->*,数据对象的存储区域将分配到字段符号。”会让人产生误解。以为只要进行ASSIGN后,引用变量就会释放地址。实际上根据我以上的例子,可以看到它并不会释放内存地址。
通俗一点理解,那个ASSIGN DREF2->* TO <FS2> 就是C#、C++、JAVA的地址指针赋值。只不过是需要借助于字段符号<XX>来输出值。
备注:个人翻译SAP一些帮助,仅仅供大家参考。若各位大仙有不同意见,请在日志中积极回复。