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

  • 相关阅读:
    Session的使用与Session的生命周期
    Long-Polling, Websockets, SSE(Server-Sent Event), WebRTC 之间的区别与使用
    十九、详述 IntelliJ IDEA 之 添加 jar 包
    十八、IntelliJ IDEA 常用快捷键 之 Windows 版
    十七、IntelliJ IDEA 中的 Maven 项目初体验及搭建 Spring MVC 框架
    十六、详述 IntelliJ IDEA 创建 Maven 项目及设置 java 源目录的方法
    十五、详述 IntelliJ IDEA 插件的安装及使用方法
    十四、详述 IntelliJ IDEA 提交代码前的 Code Analysis 机制
    十三、IntelliJ IDEA 中的版本控制介绍(下)
    十二、IntelliJ IDEA 中的版本控制介绍(中)
  • 原文地址:https://www.cnblogs.com/caizjian/p/3139886.html
Copyright © 2011-2022 走看看