指针引用的学习

在C++中的意思是:

指针是指向内存地址的,可以随时指向任何一个内存地址

引用也是指向内存地址的,但相当于这块内存的变量名称,它不能指向空的对象,引用一旦指向一个内存地址就不能改变了。并且引用只是一个指向一个内存的地址,并不能访问该内存的数据。要访问数据需要借用字段符号来完成。

指针的使用需要解除引用,所谓的解除引用就是取得该指针所指对象的值

但是在abap中也会用到指针和引用,abap中的指针就是字段符号,这里可以直接理解为已经解除引用的指针

声明引用变量:data: dref type ref to data.

通过该引用变量

abap中的引用是指向某个对象内存地址的,要操作该对象时必须要借用字段符号来解引用,意思就是获取该引用的对象值赋给字段符号,

引用变量的创建:data:dref type ref to data.
利用引用创建动态数据对象:create data dref type/like obj "obj是一个类型,创建动态数据对象的时候这一项必须要的。这类型还可以动态指定比如:

create data dref type(name). 这里的变量name中包含的具体类型比如是“C”


引用变量可以互相赋值,就是目标对象和源引用变量指向相同的数据对象,但不能将对象引用或非引用对象的值传递给引用变量

例子:

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.


  FIELD-SYMBOLS:<fs1> TYPE t_struct, "定义类型为t_struct的字段符号<fs1>
                 <fs2> TYPE i.                       "定义类型为i的字段符号<fs2>


  CREATE DATA dref1 TYPE t_struct.  ”利用引用变量创建一个动态数据对象,该数据对象是t_struct类型,而且改数据对像是没有名字的,只能通过引用寻址


  ASSIGN dref1->* to <fs1>.    "解除引用 并把该引用的对象数值值赋给字段符号<fs1>
  <fs1>-col1 = 1.                     "给字段符号赋值
  <fs1>-col2 = 2.
  dref2 = dref1.                        "引用变量互相赋值,使得dref2也指向该动态数据对象
  ASSIGN dref2->* to <fs2> CASTING.  "解除引用并赋值给字段符号<fs2>并且隐式强制转换
  WRITE / <fs2>.
  get REFERENCE OF <fs1>-col2 INTO dref2. “获取字段符号<fs1>-col2所指的引用动态数据对象的内存地址并赋值给引用变量dref2
  ASSIGN dref2->* to <fs2>.            "解除引用并赋值给<fs2>
  WRITE / <fs2>.
View Code

 还有一例子如下代码如下:

 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.
View Code

"  GET REFERENCE OF lv_data INTO LR_DATA. 读取变量给动态变量

原文地址:https://www.cnblogs.com/caizjian/p/3139886.html