*和*&之间有什么区别?在函数参数中。例如,
这有什么区别,
void a(SomeType *s)
{
}
这个,
void a(SomeType *&s)
{
}
答案 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
仍为nullptr
且a1
内分配的内存泄漏。
a2
接受对指针的引用,因此s
是&#34;别名&#34;到p2
。因此,a2
返回p2
时指向a2
内分配的内存。
一般情况下,请参阅What's the difference between passing by reference vs. passing by value?。然后将这些知识应用于指针。
答案 2 :(得分:0)
在第一种情况下,函数接受指针的值。在第二种情况下,函数接受对指针变量的非常量引用,这意味着您可以通过引用更改此指针位置。