【问题标题】:C++ Pass by Reference ProgramC++ 参考传递程序
【发布时间】:2010-08-03 17:51:48
【问题描述】:

IBM 在下面的示例中解释了 C++ 通过引用(包括源代码)。

如果我把void swapnum...改成void swapnum(int i, int j),会变成传值吗?

// pass by reference example
// author - ibm

#include <stdio.h>

void swapnum(int &i, int &j) {
  int temp = i;
  i = j;
  j = temp;
}

int main(void) {
  int a = 10;
  int b = 20;

  swapnum(a, b);
  printf("A is %d and B is %d\n", a, b);
  return 0;
}

Source

【问题讨论】:

    标签: c++ pass-by-reference pass-by-value


    【解决方案1】:

    如果您按值传递,则执行的任何交换只会在它们被传递到的函数中受到影响或看到,而不是在调用代码中。此外,一旦您返回 main,您将看到 a 和 b 没有交换。这就是为什么在交换数字时要通过 ref 传递。

    如果您只是问它是否会这样称呼,那么是的,您是对的,您将按价值传递。

    这是一个例子:

    #include <stdio.h>
    
    void swapnum(int &i, int &j) {
      int temp = i;
      i = j;
      j = temp;
    }
    
    void swapByVal(int i, int j) {
      int temp = i;
      i = j;
      j = temp;
    }
    
    int main(void) {
      int a = 10;
      int b = 20;
    
      swapnum(a, b);
      printf("swapnum A is %d and B is %d\n", a, b);
    
      swapByVal(a, b);
      printf("swapByVal A is %d and B is %d\n", a, b);
    
      return 0;
    }
    

    运行此代码,您应该会看到更改只有通过引用交换才能保持不变,也就是说,在我们返回到 main 之后,值被交换了。如果你按值传递,你会看到调用这个函数并返回到实际上 a 和 b 没有交换的 main。

    【讨论】:

    • 您忘记将第二个 swapnum 方法命名为 swapByVal
    • @RichNotFred - 我想说它仍然很接近星期一所以请原谅我:)。虽然已编辑。
    • 实际上,如果我们在这段代码中首先运行 swapByVal 会更好地理解会发生什么。因为我们首先运行 pass by ref,所以 x 和 y 的值已经改变了。首先运行按值参数传递将有助于理解。很棒的代码,谢谢。
    【解决方案2】:

    是的,但这意味着 swapnum 将不再像名称所暗示的那样工作

    【讨论】:

    • 谢谢你,迈克。所以我想我也可以将指针传递给swapnum,但我必须传递它们的地址?例如: int *p, *q;交换号(&p, &q)
    • @Kevin - 没错,你会传递指针的地址。
    • 如果你真的传递了 *p, *q 你会按值传递。
    【解决方案3】:

    是的。 '&' 操作符指定参数应该指向传入的内存地址。

    通过移除这个操作符,一个对象的副本被创建并传递给函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多