当通过C ++中的引用传递时,* val和&val的区别如何?

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 ++中通过引用传递指针会带来什么好处?

    祝你好运!


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

    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
    

    开始您的问题:

  • 两者都完全一样吗? 是和不是。 您可能会得到相同的机器代码,但您可以像在自己的代码中看到的那样在函数中使用它们。 因为你不能改变这些指针,而你真的不想这样做,所以参考更有意义。

  • 在编码实践方面都同样好? 在C中,你没有选择,只能在C ++中使用引用。 如果你传递数组,你可能会想到,尽管存在可以被引用的C ++数组(std :: arrays)。 你仍然可以使用指针来引用返回方法,因为C ++主要知道C。

  • 一个人会工作的情况下,其他人不会? 对于C数组,一个常量指针可能会有所帮助,但是通过STL(向量和数组)可以实现相同的数据结构和引用。

  • 我可以用其他方法做什么,我不能用其他方法做什么? 那么,指针比引用更强大,但是我认为如果你想通过引用传递值,那么你得到的额外能力并不能真正帮助你。 还要记住,你仍然可以返回一个也可以由结构或类组成的值。 如果你喜欢返回值,只有一个是可能的(不像在Matlab中),但你可以通过其他数据类型定义将它们作为包返回。

  • 注意:阅读由@hardydragon提供的链接,并带有一个很棒的解释

    关于C ++中的引用:

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

    在C中只存在指针。 你可以通过它们作为“参考”。 当C ++被引入时,引用到达可以定义的地方

    int &val2
    

    但是这里有一个问题,引用通常和指针做同样的事情,但是你不能改变地址,因为没有直接的地址访问变量。 如果你访问一个C ++引用,它会给你你指向/引用的值,它将允许你修改该值; 他们像正常变量一样工作。 在定义的不利方面,你必须告诉参考立即引用它的地方:

    int a = 5; int&b = a; //如果你通过引用传递它对你的函数的给定参数具有相同的效果

    指针可以指向运行时为空,无效或无论你想在内存中的任何东西。 您可以在任何部分更改地址。 你也可以做指针算术,这是不可能的参考。 当然这很危险,但你可能已经知道为什么了。

    关于指针的问题是,人们对它们感到困惑,特别是解引用(&)操作符和指针(*)定义对许多人来说是/不清楚的。 考虑指针指针并不能真正改善这种情况。 因此,使用C ++中的引用使得许多人的生活变得更加简单。 这并不意味着你不应该理解指针。 关键是你的代码变得更加可读。

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

    所以这是我的意见,但对于通过引用来调用,您应该使用引用,除非有原因您不能。

    链接地址: http://www.djcxy.com/p/20737.html

    上一篇: How *val and &val differ when passed by reference in C++

    下一篇: (C++) Passing a pointer into a template