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

时间:2014-07-13 01:49:33

标签: c++

*和*&之间有什么区别?在函数参数中。例如,

这有什么区别,

void a(SomeType *s)
{

}

这个,

void a(SomeType *&s)
{

}

3 个答案:

答案 0 :(得分:2)

将引用(使用&)传递给函数时,可以修改该值,修改不会是本地的。如果您未传递引用(无&),则修改将是函数的本地修改。

#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 = %d\n", *ptr);
    f1(ptr);
    std::printf("*ptr = %d\n", *ptr);
    f2(ptr);
    std::printf("*ptr = %d\n", *ptr);
    return 0;
}

输出:

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

答案 1 :(得分:1)

首先,让我们添加一些&#34;肉类&#34;到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仍为nullptra1内分配的内存泄漏。

a2接受对指针的引用,因此s是&#34;别名&#34;到p2。因此,a2返回p2时指向a2内分配的内存。

一般情况下,请参阅What's the difference between passing by reference vs. passing by value?。然后将这些知识应用于指针。

答案 2 :(得分:0)

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