*和*在C ++中有什么区别?

这个问题在这里已经有了答案:

  • 什么是参考指针? 2个答案
  • 传递引用与价值传递之间有什么区别? 18个答案

  • 首先,让我们添加一些“肉”到a

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

    现在,假设你有这样的代码,它调用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接受一个指针,所以变量s是指针p1一个副本。 所以当a返回时, p1仍然是nullptr并且在a1内部分配的内存泄漏。

    a2接受对指针的引用,所以sp2的“别名”。 所以当a2返回p2指向a2内部分配的内存。

    一般来说,请参阅按引用传递与按值传递之间的区别是什么? 然后将这些知识应用于指针。


    当您将参考(使用& )传递给函数时,您可以修改该值并且修改不会是局部的。 如果不传递引用(无& ),该修改将是本地的功能。

    #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;
    }
    

    输出:

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

    在第一种情况下,函数接受指针的值。 在第二种情况下,该函数接受对指针变量的非常量引用,这意味着您可以通过引用更改此指针位置。

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

    上一篇: What is the difference between * and *& in C++?

    下一篇: How do I invoke a Java method when given the method name as a string?