在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>.
还有一例子如下代码如下:
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.
" GET REFERENCE OF lv_data INTO LR_DATA. 读取变量给动态变量