我有一个简单的问题,希望通过引用传递背后的基础逻辑。
这是一个代码(我们称之为Code1):
void fn(int& a)
{
a = 6;
}
int main()
{
int b = 5;
fn(b);
cout << b;
}
这是另一个代码(Code2):
void fn(int* ptr)
{
*ptr = 6;
}
int main()
{
int b = 5;
fn(&b);
cout << b;
}
通过价值代码(代码3):
void fn(int a)
{
a = 6;
}
int main()
{
int b = 5;
fn(b);
cout << b;
}
这是我的问题。直觉上,我看到在传递值(Code3)时,会复制值,即只会将b
的值复制或复制到自身中。因此,作为一般规则,我看到传递的值只是被复制到被调用的函数(这里是fn)。即使使用指针代码(即Code2),代码2的第一行也可确保int *ptr = &a;
我不明白这在Code1中是如何工作的。说&a = b
毫无意义。这是一个例外,还是符合上述段落中讨论的情况的规则?
谢谢!
答案 0 :(得分:2)
对于大多数意图和目的,引用只是伪装的指针。不同的语法,相同的效果(主要是)。
答案 1 :(得分:2)
在此功能中:
void fn(int &a) {
a=6;
}
术语&#34;&amp; a&#34;并不意味着&#34;变量a
&#34;的地址。它表示&#34;名为a
&#34;的引用。代码1和代码2实际上是相同的(但请注意,代码2中的函数可以传递无效指针,这对代码1来说几乎是不可能的。)
答案 2 :(得分:0)
从概念上讲,在您的第一种情况下,相同的变量有两个标签:b
,在main()
的范围内可见;和a
,在fn
范围内可见。
您不必担心编译器在“幕后”执行此概念所做的事情。
如果你在心理上将编译器的“幕后”动作推广到实际上是C ++的想象原则,例如: “引用是伪装的指针”,然后它会让你对实际上一个非常简单的概念感到困惑:为变量赋予多个名称的能力。
作为函数参数并不特别;例如你可以写main()
:
int a;
int &c = a;
完全等同于:
int c;
int &a = c;
在这两种情况下,int
变量都有两个标签,a
和c
。