在C++中传递/检索指针

Passing/Retrieving pointers in C++

本文关键字:检索 指针 C++      更新时间:2023-10-16

当在C++中通过指针传递或检索对象时,已知对象本身不会被复制,但是指针呢,接收功能处理对象的相同指针或该指针的副本也是如此,因此当不再需要时,每个指针都应分配给null。

在 c++ 中传递指针时(即foo(some_object* p)( 实际上传递了指针的值,即对象所在的位置。值本身是一个副本,这意味着如果你在函数内部p = NULL;,这不会改变原始指针,但它指向的地址包含相同的原始对象。

例:

#include <iostream>
using namespace std;
class obj{
public:
int a;
};
void foo(obj* pp){
pp->a = 2;
pp = NULL;
cout << pp << endl;
}
int main() {
obj* p = new obj();
p->a = 1;
cout << p << 't' << p->a << endl;
foo(p);
cout << p << 't' << p->a;
return 0;
}

您会注意到,尽管内部更改了foo,但在执行后p保持不变,因为更改的是p的副本,而a实际上是在foo期间更改的

指针被复制,但由于该副本的值仍然是相同的内存位置,因此您仍然可以修改副本指向的变量。

@CIsForCookies 解释得很好...

添加一个小细节:

[...]或该指针的副本,因此在不再需要时应将每个指针分配给null?

函数参数是函数的局部变量,就像在函数体内声明的变量一样。这意味着一旦函数返回,它们的生命周期就会结束。

因此,在返回之前将任何指针设置为 null 都是徒劳的,因为之后(复制的(指针将不再存在......

指针只是一个数字(如int变量(,指向存储变量的存储单元(实际上是它的开头(。如果将变量int传递到函数中,则不必在使用后将其设置为0,编译器将为您完成此操作。

此外,如果您传递的变量没有引用,则很可能会使用临时副本。

void test (VarType* ptr) {...}

您可以使用对指针的常量引用,它的行为类似于对变量的常量引用:

void test (VarType* const& ptr) {...}