在C++中传递/检索指针
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;
}
您会注意到,尽管内部更改了foo
,但在执行后p
保持不变,因为更改的是p
的副本,而a
实际上是在foo
期间更改的
指针被复制,但由于该副本的值仍然是相同的内存位置,因此您仍然可以修改副本指向的变量。
@CIsForCookies 解释得很好...
添加一个小细节:
[...]或该指针的副本,因此在不再需要时应将每个指针分配给null?
函数参数是函数的局部变量,就像在函数体内声明的变量一样。这意味着一旦函数返回,它们的生命周期就会结束。
因此,在返回之前将任何指针设置为 null 都是徒劳的,因为之后(复制的(指针将不再存在......
指针只是一个数字(如int
变量(,指向存储变量的存储单元(实际上是它的开头(。如果将变量int
传递到函数中,则不必在使用后将其设置为0
,编译器将为您完成此操作。
此外,如果您传递的变量没有引用,则很可能会使用临时副本。
void test (VarType* ptr) {...}
您可以使用对指针的常量引用,它的行为类似于对变量的常量引用:
void test (VarType* const& ptr) {...}
相关文章:
- 如何检索指向在单独线程上运行的函数的移动指针?
- 初始化类中的指针数组,并在另一个类中检索它
- std::shared_ptr 使用别名构造函数,是否可以检索初始指针值?
- 在 c++ 中使用指向对象的指针检索数据
- 如何在函数中检索指针结构
- 在C++中传递/检索指针
- 检索不同类型的对象指针
- 如何检索指向列表数据结构中的变量的指针?
- 手动检索和存储指向 OpenGL 函数的指针时遇到问题
- 检索C++程序/文件中使用的指针变量列表
- 使用OpenCV中的指针检索深度
- 检索在函数内部使用运算符new分配的类指针对象成员的值时出现的问题
- 如何检索智能指针数组的大小?(例如std::unique_ptr<int[]>)
- 存储双指针地址并检索其值
- C++指针运行时错误 - 使用指针设置变量然后检索
- 从存储在 CTreeCtrl 的 LPARAM 中的结构中检索地址/指针 (IXMLDOMNode*) - 不起作用
- ArgumentError 在 Boost.Python 中的类中存储和检索指针:错误的类型
- 从 Objdump 实用程序检索 vptr(指向虚拟表又名 VTABLE 的指针)
- 从指针检索字符串时获取常量空行输出
- 在c++中的数组中存储和检索指针