*val 和 &val 在 C++ 中通过引用传递时有何不同

How *val and &val differ when passed by reference in C++

本文关键字:val 引用 何不同 C++      更新时间:2023-10-16
void funct( int *val1, int &val2)
{
    *val1= 20;
    val2= 22;
}
int main()
{
    int v1=10, v2=12;
    funct(&v1, v2);
    cout<<"v1: "<<v1<<endl<<"v2: "<<v2<<endl;
    return 1;
}

v1 和 v2 都是通过 funct() 引用调用的。但我不明白,除了语法差异之外,两种方式有什么区别。我想问的几个问题是,

  • 两者是完全不同的事情吗?
  • 两者在编码实践方面是否同样出色?
  • 一个会工作,另一个不会工作的情况?
  • 我可以使用一个做的其他事情,我不能使用其他做什么?

为了简化起见,我会打电话给:

int *val1 ------- Method 1
int &val2 ------- Method 2

我猜您正在尝试通过引用和指针来理解调用的功能。为了更多更好的理解,我建议您阅读这个问题的答案。

在C++中,通过指针传递比按引用传递有什么好处吗?

祝你好运!

回答您的问题:

  • 两者是完全不同的事情吗?是和不是。您可能会得到相同的结果机器代码,但您在函数中使用它们的方式与您在自己的代码中看到的有所不同。因为您无法更改这些指针,并且您真的不想更改,所以引用更有意义。

  • 两者在编码实践方面是否同样出色?在 C 中,您没有选择,但在C++中您应该使用引用。如果你传递数组,你可能会考虑C++存在数组(std::arrays),这些数组也可以被引用。您仍然可以将指针用于按引用返回方法,因为C++主要了解 C。

  • 一个会工作,另一个不会工作的情况?对于 C 数组,常量指针可能会有所帮助,但您可以通过 STL(向量和数组)进行数据结构,它可以执行相同的操作并使用引用。

  • 我可以使用一个做的其他事情,我不能使用其他做什么?好吧,指针比引用更强大,但我认为如果您想通过引用传递值,您获得的额外功能对您没有真正的帮助。还要记住,您仍然可以返回一个值,该值也可以由结构或类组成。如果您更喜欢返回值,则只能返回一个值(例如,与 Matlab 不同),但您可以通过其他数据类型定义将它们作为捆绑包返回。

注意:阅读提供的链接@hardydragon并附有精彩的解释

关于C++中的引用:

虽然这个问题在许多关于C++的书中都有解释,但让我试着专注于你的具体问题。

在 C 中,只有指针存在。您可以将它们作为"参考"传递。当引入C++时,引用就位了,您可以在其中定义

int &val2

这里有一个问题,引用通常与指针做同样的事情,但你不能改变地址,因为没有对变量的直接地址访问。如果您访问C++引用,它将为您提供指向/引用的值,并允许您修改该值;它们像普通变量一样工作。在其定义的缺点方面,您必须立即告诉引用它引用的位置:

整数 a = 5;int &b = a;如果通过引用传递,则对于给定参数对函数具有相同的效果

指针可以在运行时指向 null、无效内容或内存中所需的任何内容。您可以随时更改地址。你也可以做指针算术,这是引用不可能实现的。当然,这很危险,但您可能已经知道为什么。

关于指针的问题是,人们会/对它们感到困惑,尤其是取消引用 (&) 运算符和指针 (*) 定义对许多人来说不清楚。考虑指针到指针并不能真正改善这种情况。因此,使用像C++这样的参考资料使许多人的生活更轻松。这并不意味着您不应该理解指针。关键是你的代码变得更具可读性。

因此,作为一般提示,因为您使用C++,请使用引用。由于它的限制,并不总是可以使用它们,但只要有可能,就会使用它们。

所以这是我的观点,但对于引用调用,你应该使用引用,除非有理由你不能。

就您提供的代码的功能而言,这两个函数之间没有区别:

void swap_with_addresses(int * a, int * b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
void swap_with_references(int & a, int & b) {
    int tmp = a;
    a = b;
    b = tmp;
}
int main() {
    int a = 5, b = 10;
    std::cout << a << "," << b << std::endl;
    swap_with_addresses(&a, &b);
    std::cout << a << "," << b << std::endl;
    swap_with_references(a, b);
    std::cout << a << "," << b << std::endl;
    return 0;
}

执行此代码将产生:

5,10
10,5
5,10