如何理解 "Pass By Reference Within a Function" w3schools 示例?

How to Understand "Pass By Reference Within a Function" w3schools example?

我很难理解 w3schools 教程中的这个示例是如何工作的。

#include <iostream>
using namespace std;

void swapNums(int &x, int &y) {
  int z = x;
  x = y;
  y = z;
}

int main() {
  int firstNum = 10;
  int secondNum = 20;

  cout << "Before swap: " << "\n";
  cout << firstNum << secondNum << "\n";

  // Call the function, which will change the values of firstNum and secondNum
  swapNums(firstNum, secondNum);

  cout << "After swap: " << "\n";
  cout << firstNum << secondNum << "\n";

  system("pause");
  return 0;
}

我想我理解了第一部分:

void swapNums(int &x, int &y) {
  int z = x;
  x = y;
  y = z;
}

我基本上是在引用调用该函数时 xy 将要出现的任何内容。所以 x 将“指向”firstNum,而 y 将指向 secondNum。它将使用第三个变量作为占位符来执行 switcheroo。

然而,在我调用函数swapNums(firstNum, secondNum);之后,我不明白这个带有局部变量的函数如何能够改变int firstNum = 10;int secondNum = 20;的值。 我的理解是函数内的变量是“局部的”,并且所述变量的范围仅在函数本身内扩展。局部变量如何在没有任何 return 语句的情况下更改其自身函数之外的其他变量?

试试这个

#include <iostream>

void change_val_by_ref(int &x)
{
    x=100
}

void change_val_by_val(int x)
{
    x=50;
}
int main()
{
    int whatever=0;
    std::cout<<"Original value: "<<whatever<<"\n";
    change_val_by_ref(whatever);
    std::cout<<"After change by ref: "<<whatever<<"\n";
    change_val_by_val(whatever);
    std::cout<<"After change by val: "<<whatever<<"\n";
}

您将看到的输出是:

0
100
100

让我们看看发生了什么

  • change_val_by_ref改了原来的whatever,因为ref 正在“指向”变量。
  • change_val_by_val 并没有改变 whatever,因为函数 x 的参数刚刚复制了 whatever 的值,并且 whatever 发生的任何事情=16=]不会影响whatever,因为它们没有关系。

这就是通过参考的意义所在

假设您将香蕉和橙子放在两个不同的盘子里。你用机械手把它们放进大盒子里。 显然,您可以用手改变他们的目的地。但是你想让机械手来完成这个任务。你需要知道香蕉和橙子放在哪里,这样机械手才能完成它的工作。 !重要的机械手不关心放在这些盘子里的水果,它只关心改变它们的位置。 通过使用指针,您只需告诉函数您要更改的对象的位置。您可以为此设置适合您的本地名称。所以指针只是一个盘子的名字,里面包含了一定的值。

引用是传递变量地址的语法糖。您传递的不是变量本身,而是它的内存地址,然后函数使用变量的地址来更改其值。就那么简单。等效的 C 代码为:

void swap(int* a, int* b) {
  int tmp = *a;
  *a = *b;
  *b = tmp;
}