在我们使用按引用传递的 C++ 中,我们引用我们传递的任何地址的地址
从实参到函数的形参本质上是一个指针对吗?
没有。引用是现有变量的别名(即替代名称)。
但是在汇编级别,您的实现可能会将引用变量的地址放在地址寄存器(或类似的东西)中,以供被调用函数使用(如果这是您的意思的话)。
但为了简单起见,您可以将其视为自动取消引用的指针(这是我刚开始时所做的)。但是当你进入语言时,引用实际上与指针有根本的不同。
所以虽然它们本质上是一样的,别名和所有的东西,指针不是也需要内存空间吗?
C++ 级别的指针需要空间(因为它是可寻址的)。您可以获取指针的地址。从根本上说,引用不需要空间(因为您无法获取其地址)。在实现级别,它可能有也可能没有物理内存位置,具体取决于编译器如何实现它。
所以我们不应该在参数函数中调用 B 指向所传递参数的内存位置,让我们调用 A
如果您用代码示例解释了上述内容,那就太好了。但我想我明白了。假设函数没有内联,那么作为引用传递的任何参数都需要某种形式的链接回原始对象(因为引用总是从根本上引用活动对象)。那么它是怎么做的。编译器实现细节(所以你不应该关心)。但可能是堆栈上的一个指针,也可能只是地址寄存器中的一个地址。
这又是我们值的内存位置(因为 A 将我们的值的内存位置作为参数传递)?
也许或不。参考文献在语言级别没有物理位置。所以编译器可以用它玩很多漂亮的小技巧。
在我们使用按值传递的 java 中,我们会复制我们传递的任何地址(例如对对象的引用)。
在 Java 中,您通过值传递引用。但是 Java 引用基本上只是指向内存位置的指针。所以你通过值传递一个指针。这是使用的一种技术。幸运的是,C++ 不会将您限制在一种技术上。
您可以通过值或引用传递参数。您甚至可以通过值或引用传递指向对象的指针。因此,可以根据情况使用一些有趣的技术。
所以最后我并没有真正看到按值传递和按引用传递之间的区别。
可能是因为您正在考虑 java 引用(按值传递)。
在 C++ 中。如果您按值传递,您将创建一个作为参数传递的新对象(这意味着您制作原始对象的副本,这可能会花费)。如果通过引用传递,则将别名传递给对象。因此,当您与对象交互时,您正在修改原始对象。
int inc(int val) // pass by value
{
return ++val; // increment the passed value and return as a result.
}
int incref(int& val) // pass by reference
{
return ++val; // increment the reference.
// Since the reference is an alias this increment affects the
// original object. The result is returned.
}
void code()
{
int x = 5;
int y = inc(x); // x =5 and y = 6
int a = 8;
int b = incref(a); // a = 9 and b = 9
}
按值传递为原始传递的参数分配内存空间,指向该值并通过引用传递的副本将我们值的内存位置作为参数传递给参数(在内存中分配空间的指针) ) 在我们的函数中用于指向值。
对不起,我弄丢了。