通过引用传递不一致 - 这个通过引用传递的简单示例如何工作?

时间:2014-03-30 01:02:48

标签: c++ function parameter-passing

我有一个简单的问题,希望通过引用传递背后的基础逻辑。

这是一个代码(我们称之为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毫无意义。这是一个例外,还是符合上述段落中讨论的情况的规则?

谢谢!

3 个答案:

答案 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变量都有两个标签,ac