我有一个简单的问题,并希望通过引用传递背后的基础逻辑。通过引用传递的不一致性 - 通过引用传递的这个简单示例如何工作?
这里有一个代码(姑且称之为代码1):
void fn(int& a)
{
a = 6;
}
int main()
{
int b = 5;
fn(b);
cout << b;
}
这里的另一个代码(代码2):
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)Code 2的第一行确保int *ptr = &a;
我不明白这将如何在Code1中工作。说&a = b
是没有意义的。这是一个例外,还是这符合与上述段落中讨论的情况一致的规则?
谢谢!
“,这对代码1来说(几乎)是不可能的”这基本上是一种语义上的区别。所有的编译器都在下面实现引用作为指针,如果你有像'void fn2(int * a){fn(* a); }',它会编译这个函数,只是简单地传递地址,而不是“解除引用”。所以*有效*你可以像传递一个无效指针那样容易地传递一个无效的引用。一个语言纯粹主义者会说无效指针的解引用表达是未定义的行为,所以之后的任何东西都是没有意义的。但这只是一个学术技术性问题,对程序员来说是不可见的。 – newacct