[英]Passing/Retrieving pointers in C++
在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;
}
您会注意到,尽管在内部执行了更改,但p
在执行foo
之后仍保持不变,因为更改的是p
的副本,而a
在foo
期间实际上已更改
指针已被复制,但是由于该副本的值仍位于相同的内存位置,因此您仍然可以修改副本所指向的变量。
@CIsForCookies很好地解释了...
添加一个小细节:
[...]或该指针的副本,因此在不再需要时应将每个指针分配为null吗?
函数参数是函数本地的变量,就像在函数体内声明的变量一样。 这意味着一旦函数返回,它们的生命周期就会结束。
因此,在返回之前将任何指针设置为null都是徒劳的,因为之后,(复制的)指针根本不再存在了...
指针只是一个数字(如int
变量),它指向存储该变量的存储单元(实际上指向它的开头)。 如果将int
变量传递给函数,则在使用后不必将其设置为0
,编译器将为您完成此操作。
同样,如果您传递的变量没有引用,则很有可能会使用一个临时副本。
void test (VarType* ptr) {...}
您可以使用对指针的const引用,其行为类似于对变量的const引用:
void test (VarType* const& ptr) {...}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.