ABAP 数据引用
TYPE REF TO data 数据引用data references
TYPE REF TO object 对象引用object references “object不能直接跟在TYPE后面,只能跟在TYPE REF TO后面
TYPE REF TO 后面可接的通用类型只能是data(数据引用)或者是object(对象引用)通用类型,其他通用类型不行
TYPES: BEGIN OF t_struct,
col1 TYPE i,
col2 TYPE i,
END OF t_struct. "定义一个结构体类型作为参考"
DATA: LS_STRUCT TYPE T_STRUCT. "定义一个结构体变量做参考"
DATA: dref TYPE REF TO DATA . "dref即为数据引用,即数据指针,指向某个变量或常量,存储变量地址 用DATA 作为参考就是暂时不指定类型
DATA: ref TYPE REF TO t_struct ."ref以结构体作为参考
FILED-SYMBOLS <FS> TYPE ANY. "参考任意类型"
FILED-SYMBOLS <FS> TYPE t_struct .
1.数据引用 Data References
- Type Ref To 有两种初始化的方法: 必须初始化
1:第一种是用 CREATE DATA 动态开辟内存; (类似C语言定义指针会默认分配一个空间也可以用malloc分配一块空间给指针[指针值就是这块空间的首地址] abap指针必须要手动’malloc’ 一下内存空间)
如果定义 ref 是指定特定的类型或者结构的,那么 CREATE DATA 时 TYPE 可以省略。
无论定义时 ref 是否有特定的类型或者结构,CREATE DATA 时必须指定特定的类型或者结构,不能是data这种泛型的。
一般来说为了使用方便,还是应该指定 Field Symbol 或者 Type Ref To 的类型或者结构,以便之后直接使用。
CREATE DATA dref TYPE C. "dref由于没有定义类型 所以初始化时必须指定类型 此时的类型可以是随便什么的 没有限制
CREATE DATA ref . "ref在定义时就指定了类型 初始化时无需再次指定类型"
2:第二种是用 GET REFERENCE OF 指向已经存在的内存变量.
GETREFERENCE OF LS_STRUCT INTO ref. "效果相当于ref指向变量LS_STRUCT
- Field Symbol 的初始化,则只能指向已经存在的内存变量
FS是已经解引用的指针(类似C语言有指针p,FS就是*p,其本质已经是变量不是地址,而上述TYPE REF TO 得来的引用本质是地址)
ASSIGN LS_STRUCT TO <FS> "初始化FS 必须是已有的变量 而不是类型"
- 两者区别
Type Ref To 和 Field Symbol 在用法上目前发现的主要区别:
1) Type Ref To 可以动态开辟内存,在动态内表时,可以等在程序运行时获得结构后再开辟内存,并且赋值给某个 Field Symbol。而光用 Field Symbol 是做不到的,因为 Field Symbol 的初始化需要“挂”在已知结构上。
2)Type Ref To 不像 Field Symbol 那样有LOOP AT it_tab ASSIGNING < fs >的写法,ref->不是指向内表数据,而是类似工作区指向某块内存,所以更改数据后需要 modify 到内表,如果不需要数据了要clear*。而 Field Symbol 则不需要考虑 modify 和 clear。
3)IF < fs1> = < fs2> 是比较内存里的值,相对应的是IF ref1->* = ref2->*,而不能判断比较 IF ref1 = ref2 。 - 使用数据引用 包含二级指针使用 【重点理解】
DATA: ref1 TYPE REF TO t_struct . "定义指针 指定类型"
DATA: ref2 LIKE REF TO ref1. "二级指针
CREATE DATA ref1 . "初始化 分配新的内存空间"
CREATE DATA ref2 .
ref1 "指针 类似指针p"
ref2 "指针的指针 类似q 本质是&p"
ref1->* "解引用 一级指针的使用 类似*p"
ref2->* "解引用 二级指针的使用 类似*q 本质是p"
ref2->*->* "解引用 二级指针的使用 类似**q 本质是*p"
如果定义时指定了特定的类型或者结构,那么 Field Symbol 和 Type Ref To 都可以直接使用
如果定义时没有指定类型或者结构,那么 Type Ref To 必须 ASSIGN 到另外一个 Field Symbol 里间接使用
TYPES: BEGIN OF t_struct,
col1(6) TYPE C,
END OF t_struct.
DATA: dref TYPE REF TO DATA ."dref即为数据引用,即数据指针,指向某个变量或常量,存储变量地址
DATA: ref TYPE REF TO t_struct . "定义一个p指针"
CREATE DATA dref TYPE C LENGTH 6. "使用前必须先指定类型"
FIELD-SYMBOLS <FS> TYPE any. "泛用型类型
ASSIGN dref->* TO <FS>.
<FS> = 'abc'.
CREATE DATA ref . "无需再次指定类型 初始化p指针内存空间"
ref->*-col1 = 'abcd'. "类似 *p-col1 = xx"
WRITE:/ <FS>,
ref->*.