*和*在C ++中有什么区别?
这个问题在这里已经有了答案:
首先,让我们添加一些“肉”到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
是p2
的“别名”。 所以当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?