zoukankan      html  css  js  c++  java
  • 指针引用的学习

    在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. 读取变量给动态变量

  • 相关阅读:
    CreateRemoteThread注入DLL
    远程线程注入引出的问题
    jQuery中排除指定元素,同时选择剩下的所有元素
    YUIDoc的使用方法小结
    实验二 栈和队列的应用
    实验一 线性表的基本操作
    最大子段和详解
    HDOJ 1995 汉诺塔V
    错排公式 详细解答
    HDOJ 2212 DFS
  • 原文地址:https://www.cnblogs.com/caizjian/p/3139886.html
Copyright © 2011-2022 走看看