美文网首页
引用传递和值传递(转载)

引用传递和值传递(转载)

作者: 阿努比斯1117 | 来源:发表于2019-03-11 10:09 被阅读0次

ABAP中FORM参数的传递有以下几种方式。
  1.引用传递(CALL BY REFERENCE)
  传递参数时将参数的地址(ADDRESS)传至子程序中,也就是子程序中的参数变量与外部程序的参数变量共享地址内的值。又叫CALL BY ADDRESS,若子程序中的参数变量的值发生了改变,那么,外部程序的实际变量的值也发生改变。
  [Syntax]
  FORM <subform> [USING <f1> <f2>...] [CHANGING <fr1> <fr2>...]
  PERFORM <subform> [USING <f1> <f2>...] [CHANGING <fr1> <fr2>...]
  USING 之后跟随着不会发生变化的子程序参数,CHANGING后面的参数按引用传递,值会随着子程序内的变化而变化。
  [FOR EXAMPLE]

DATA: i_num1 TYPE I VALUE 10,
  i_num2 TYPE I VALUE 20,
  i_num3 TYPE I.

WRITE: / 'I_NUM1=',i_num1,
  'I_NUM2=',i_num2,
   'I_NUM3=',i_num3.

PERFORM CALCULATOR USING i_num1 i_num2 CHANGING i_num3.
  WRITE: / 'I_NUM1=',i_num1,
  'I_NUM2=',i_num2,
  'I_NUM3=',i_num3.

FORM CALCULATOR USING NUM1 NUM2 CHANGING NUM3.
  NUM3 = NUM1 + NUM2.
  WRITE: / 'NUM1=',NUM1,
'NUM2=',NUM2,
'NUM3=',NUM3.

"NUM1 = NUM1 + 10. "不允许修改
"NUM2 = NUM2 + 12. "不允许修改
  ENDFORM.
  程序运行结果如下,i_num3变量在调用子程序后值变为了30.

2.值传递(CALL BY VALUE)
  值传递就是将参数的值复制一份到另一个至内存地址中,所以在子程序中参数变量的值的改变不影响外部程序实际变量的值。
  [Syntax]
  FORM <subform> [USING VALUE(f1) VALUE(f2)...]...
  PERFORM <subform> [USING VALUE(f1) VALUE(f2)...]...
  VALUE(f1) VALUE(f2)是按值传递的CALL BY VALUE
  [For Example]
  DATA: i_num1 TYPE I VALUE 10,
  i_num2 TYPE I VALUE 20,
  i_num3 TYPE I.

WRITE: / 'I_NUM1=',i_num1,
  'I_NUM2=',i_num2,
   'I_NUM3=',i_num3.

PERFORM CALCULATOR_TWO USING i_num1 i_num2 CHANGING i_num3.
  WRITE: / 'I_NUM1=',i_num1,
  'I_NUM2=',i_num2,
  'I_NUM3=',i_num3.

*值传递 USING VALUE(f1)
  FORM CALCULATOR_TWO USING VALUE(NUM1) VALUE(NUM2) CHANGING SUM.
  SUM = NUM1 + NUM2.
   NUM1 = NUM1 * NUM2.
   NUM2 = NUM1 * NUM2.
  WRITE: / 'NUM1=',NUM1,
  'NUM2=',NUM2,
   'SUM=',SUM.
  ENDFORM.
  程序运行如下图,子程序内部参数变量的值发生变量,不影响外部程序实际变量的值。

当只按USING的方式传递参数时其也是按引用的方式传递,共享内存地址。如下:

DATA: i_num1 TYPE I VALUE 10,
   i_num2 TYPE I VALUE 20.

WRITE: / 'I_NUM1=',i_num1 LEFT-JUSTIFIED,
   'I_NUM2=',i_num2 LEFT-JUSTIFIED.

PERFORM CALCULATOR USING i_num1 i_num2.
   WRITE: / 'I_NUM1=',i_num1 LEFT-JUSTIFIED,
   'I_NUM2=',i_num2 LEFT-JUSTIFIED.

FORM CALCULATOR USING NUM1 NUM2.
   WRITE: / ' NUM1=',NUM1 LEFT-JUSTIFIED,
   ' NUM2=',NUM2 LEFT-JUSTIFIED.

NUM1 = NUM1 + 10.
   NUM2 = NUM2 + 12.
  ENDFORM.
  运行结果很明显,如下图:

3)值传递参数并返回最终值(CALL BY VALUE AND RETURN RESULT)
  传递参数的方式同值传递相同,但在子程序结束执行是会将传入参数变量的最终值回传一份给外部程序变量。
  [Syntax]
  FORM <subform> [.....] [CHANGING VALUE(f1)...]
  PERFORM <subform> [.....] [CHANGING VALUE(f1)...]
  CHANGING VALUE(f1)首先按CALL BY VALUE而后RETURN RESULT给外部变量.
  [For Example]
  DATA: i_num1 TYPE I VALUE 10,
  i_num2 TYPE I VALUE 20,
  i_num3 TYPE I.

WRITE: / 'I_NUM1=',i_num1,
  'I_NUM2=',i_num2,
   'I_NUM3=',i_num3.

PERFORM CALCULATOR_THREE USING i_num1 i_num2 CHANGING i_num3.
  WRITE: / 'I_NUM1=',i_num1,
   'I_NUM2=',i_num2,
   'I_NUM3=',i_num3.

FORM CALCULATOR_THREE USING NUM1 NUM2 CHANGING VALUE(TOTAL).
  TOTAL = NUM1 + NUM2.
  WRITE: / 'NUM1=',NUM1,
   'NUM2=',NUM2,
   'TOTAL=',TOTAL,
   'I_NUM3=',i_num3."原值没有发生改变
  ENDFORM.
  程序运行结果如下,i_num3的值在子程序中并没有发生变量,当子程序调用结束后将把相应的值赋予。


作者:小强pp
来源:CSDN
原文:https://blog.csdn.net/wq122289014/article/details/78180504
版权声明:本文为博主原创文章,转载请附上博文链接!

相关文章

  • 引用传递和值传递(转载)

    ABAP中FORM参数的传递有以下几种方式。1.引用传递(CALL BY REFERENCE)传递参数时将参数的地...

  • Day12-Java

    值传递和引用传递 值传递是值的拷贝, 引用传递是引用的拷贝 String 类型是引用类型, new String ...

  • Java所有参数-对象引用及基本类型值--都是值传递

    前言 当前主要存在两种传递方式,值传递和引用传递,先简单介绍值传递和引用传递值传递(pass by value)是...

  • Java中的参数传递

    为了便于理解,会将参数传递分为按值传递和按引用传递。按值传递是传递的值的拷贝,按引用传递传递的是引用的地址值,所以...

  • Dart是值传递还是引用传递

    结论:Dart是值传递。 我们先看值传递和引用传递的定义: 值传递和引用传递,属于函数调用时参数的求值策略(Eva...

  • C++基础

    C++ 值传递、指针传递、引用传递详解C++中引用传递与指针传递区别 引用传递和指针传递的区别 引用的规则:(1)...

  • 值传递和引用传递

    值传递 我们可以直接看一个值传递的例子 可见,a 和 b 的值在经过“所谓的”交换函数之后,并没能把值交互。这是为...

  • 值传递和引用传递

    什么是值传递 js是只支持值传递的,举个例子: 此时a的值在函数内是不变的,即复制了一个临时的值,这便是值传递。 ...

  • 值传递和引用传递

    在java中值传递是指传递具体的值,传递的是内容的拷贝,传递后就不关原来的什么事了 引用传递是指传...

  • 值传递和引用传递

    下面有一个代码非常好帮助理解我的理解是:引用在栈中,存储变量堆地址。实际变量在堆中。引用指向变量。方法参数传递的是...

网友评论

      本文标题:引用传递和值传递(转载)

      本文链接:https://www.haomeiwen.com/subject/oakvpqtx.html