What is the difference between * and *& in C++?

This question already has an answer here:

  • What is a reference-to-pointer? 2 answers
  • What's the difference between passing by reference vs. passing by value? 18 answers

  • First, let's add some "meat" to a :

    void a1(SomeType *s)
    {
        s = new SomeType;
    }
    
    void a2(SomeType *&s)
    {
        s = new SomeType;
    }
    

    Now assume you have this code, which calls a :

    void func()
    {
        SomeType *p1 = nullptr;
        a1(p1);
        if (p == nullptr)
            std::cout << "p1 is null" << std::endl;
        else
            std::cout << "p1 is not null" << std::endl;
    
        SomeType *p2 = nullptr;
        a2(p2);
        if (p == nullptr)
            std::cout << "p2 is null" << std::endl;
        else
            std::cout << "p2 is not null" << std::endl;
    }
    

    a1 accepts a pointer, so the variable s is a copy of the pointer p1 . So when a returns, p1 is still nullptr and the memory allocated inside a1 leaks.

    a2 accepts a reference to a pointer, so s is an "alias" to p2 . So when a2 returns p2 points to the memory allocated inside a2 .

    Generally, see What's the difference between passing by reference vs. passing by value?. Then apply that knowledge to pointers.


    When you pass a reference (using & ) into a function, you can modify the value and the modifications will not be local. If you don't pass a reference (no & ), the modifications will be local to the function.

    #include <cstdio>
    int one = 1, two = 2;
    
    // x is a pointer passed *by value*, so changes are local
    void f1(int *x) { x = &two; }
    
    // x is a pointer passed *by reference*, so changes are propagated
    void f2(int *&x) { x = &two; }
    
    int main()
    {
        int *ptr = &one;
        std::printf("*ptr = %dn", *ptr);
        f1(ptr);
        std::printf("*ptr = %dn", *ptr);
        f2(ptr);
        std::printf("*ptr = %dn", *ptr);
        return 0;
    }
    

    Output:

    *ptr = 1
    *ptr = 1
    *ptr = 2
    

    In first case the function accepts the value of a pointer. In second case the function accepts non-constant reference to the pointer variable and that means that you can change this pointer location through the reference.

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

    上一篇: 函数返回int&

    下一篇: *和*在C ++中有什么区别?