如何理解 "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;
}
我基本上是在引用调用该函数时 x
和 y
将要出现的任何内容。所以 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;
}
我很难理解 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;
}
我基本上是在引用调用该函数时 x
和 y
将要出现的任何内容。所以 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;
}