如果我们将ABAP字段符号和数据引用与C中的指针进行比较,我们会观察: -
在C中,假设我们声明一个变量“var”类型“integer”,默认值为“5”。
变量“var”将存储在内存中的某些位置,并说保存此变量的内存地址为“1000”。
现在我们定义一个指针“ptr”,并将此指针赋给我们的变量。
因此,“ptr”将为“1000”,“* ptr”将为5。
让我们比较ABAP中的上述情况。
这里我们声明一个字段符号“FS”并将其分配给变量“var”。
现在我的问题是“FS”持有什么?我在互联网上严格搜索过,但发现许多ABAP顾问认为FS持有变量的地址,即1000.但这是错误的。调试时我发现fs只有5个。所以fs(在ABAP中)相当于* ptr(在C中)。如果我的理解是错误的,请纠正我。
现在让我们声明一个数据引用“dref”和另一个字段符号“fsym”,在创建数据引用之后,我们将它们分配给字段符号。现在我们可以对这个字段符号进行操作。因此,数据引用和字段符号之间的区别是: -
如果是字段符号,我们将声明一个变量并将其分配给字段符号。
在数据引用的情况下,我们首先获取数据引用,然后将其分配给字段符号。
那么数据引用的用途是什么?我们可以通过字段符号实现相同的功能。
答案 0 :(得分:16)
字段符号很像指针,但只能以解除引用的形式访问。换句话说,它将在内部保存分配给它的变量的内存地址,但它不允许您查看内存地址,只允许查看存储在它指向的变量中的数据。这可以证明,因为如果您更改指向内部表格行的字段符号的内容,您将看到更改将直接在该行中进行。
数据引用就像一个简单的指针,除了你不能像C中那样增加或减少内存地址(ptr ++,ptr--等等)。它与字段符号不同,因为您可以比较两个数据引用以检查它们是否指向内存中的完全相同的位置。比较两个字段符号将是一个简单的值比较。另一个区别是您可以使用CREATE DATA命令通过创建数据引用来动态分配内存。字段符号只能分配给已分配的变量。
答案 1 :(得分:3)
尽管数据引用和字段符号看起来非常相似并且通常以类似的方式使用(请参阅其他答案),但它们根本不同。
数据引用是存储值的变量,就像字符串或整数一样。它们在内存和内容方面具有固定的大小。唯一的区别是这些引用是指向其他数据对象的指针,即。即内容具有特殊意义。它们可以指向任何地方,它们可以被取消引用,您可以将它们传递给其他例程,您可以操纵指针(GET REFERENCE
)或它指向的值。没什么特别的,真的 - 只需要你喜欢的编程语言中的指针就可以了。
字段符号不是“真正的”变量。 documentation表示
他们没有为场地实际预留空间
字段符号实际上只是对ABAP VM的本地symbol table的巧妙操作。我将尝试说明这一点 - 请注意,这是一个非常简化的模型。假设您声明了三个变量:
DATA: my_char TYPE c,
my_int TYPE i,
my_ref TYPE REF TO i.
然后,符号表将包含 - 以及其他 - 可能如下所示的条目:
name type size addr
------------------------------
MY_CHAR c 1 0x123456
MY_INT i 4 0x123457
MY_REF r ? 0x123461
(我不确定参考变量的实际大小。)
这些条目仅指向包含值的地址。根据这些变量的范围,它们可能位于完全不同的存储区域,但目前我们并不关心这一点。重点是:
让我们为此添加一个字段符号:
FIELD-SYMBOLS: <my_fs> TYPE any.
然后符号可能如下所示:
name type size addr target
--------------------------------------
MY_CHAR c 1 0x123456
MY_INT i 4 0x123457
MY_REF r ? 0x123461
<MY_FS> *
字段符号以其初始状态(未分配)创建。它没有指向任何地方,并且在此状态下使用它将导致短暂的转储。重要的一点是:它没有“堆”内存支持,就像其他变量一样。让我们
ASSIGN my_char TO <my_fs>.
符号可能看起来像这样:
name type size addr target
--------------------------------------
MY_CHAR c 1 0x123456
MY_INT i 4 0x123457
MY_REF r ? 0x123461
<MY_FS> * MY_CHAR
现在,当访问<my_fs>
时,运行时系统会将其识别为字段符号,在符号表中查找当前目标并将所有操作重定向到my_char
的实际位置。另一方面,如果您发出命令
GET REFERENCE OF my_int INTO my_ref.
符号表不会改变,但在“堆地址”0x123461处,您会找到“地址”0x123457。只需my_char = 'X'
或my_int = 42 * 2
等值定位。
这是一个非常简化的版本,you cannot pass field symbols as changing parameters and allow them to be reassigned inside the subroutine的原因。它们的存在方式与其他变量的存在方式不同,它们没有添加到符号表范围之外的含义。
答案 2 :(得分:1)
字段符号在ABAP中已经存在了很长时间,允许您在运行时操作和传递字段值,而不事先知道字段的名称。考虑这个用例:您有一个包含20个字段的结构,您可以按名称引用每个字段并将其分配给字段符号,然后更改特定字段的值等。
数据引用(TYPE REF TO DATA
)是ABAP的一个相对较新的补充,允许您在运行时实例化数据,而不事先使用&#39; CREATE DATA&知道类型 #39;言。
有关使用CREATE DATA
的示例,请参阅以下SAP帮助页面。它向您展示了如何使用CREATE DATA
获取对引用对象的引用(即ABAP对象引用),这是您无法使用字段符号进行的操作:http://help.sap.com/abapdocu_70/en/ABAPCREATE_DATA_REFERENCE.htm
答案 3 :(得分:0)
字段符号是 - nomen est omen - 字段的符号。您将它分配给变量,它将成为该变量的别名。
引用和字段符号之间的主要区别在于引用可以指向由CREATE DATA或CREATE OBJECT创建的匿名数据。必须始终将字段符号分配给现有变量。