为什么在按值传递指针之后再按引用传递指针会指向原始内存位置

Why does passing a pointer by reference after passing it by value point to the original memory location?

本文关键字:指针 原始 内存 位置 按引用传递 按值传递 之后 为什么      更新时间:2023-10-16

我正在使用SWIG将一些C++代码封装在Python中。我正在包装的C++函数定义为:

template <typename T>
void getData(const std::string& fileName, T*& data);

数据作为对指针的引用传递,因为文件中的数据可以是与指针相同的类型,也可以是不同的类型。在前一种情况下,我们只是将指针替换为指向文件数据的指针,在后一种情况中,我们使用std::copy将每个值强制转换为请求的类型。

现在我们来问我的问题,SWIG包装给了我以下功能:

void wrap_getData(const std::string& fileName, T* data) {
     getData(fileName, data);
}

这被称为使用:

unsigned char* data = new unsigned char[dataSizeInFile]
wrap_getData(fileName, data)

由于文件中的数据类型也是无符号字符,通常它只会更改指针内存地址(如果我使用的是getData)。然而,现在我希望这种情况不会发生,但它确实发生了。

例如,指针的原始存储器地址(&ptr)=0x000000000c840070,那么在wrap_getData函数内部,数据指针存储器地址(&ptr)是0x00000000002393e8,正如预期的那样,当指针被复制时,这是不同的。但是现在,当我通过引用实际的getData函数来传递这个指针时,内存地址(&ptr)再次为0x000000000c840070,这是我没有想到的,我希望它保持0x00000000002393e8,因为副本是通过引用传递的。为什么会发生这种情况?

您传入了指针。在函数中,创建了一个新的指针,但指针指向同一对象。通过指针,该对象(指针指向的对象)能够在函数中更改。在函数之后,使用该函数创建的指针被销毁/释放。原始指针的内存位置一直保持不变,与指针指向的值相同。

我就是这么想的。我可能读得太快了。

在调用getData(fileName, data);之前,指针data例如位于地址"a_17"上,其值例如为"v_22",在调用函数时,会创建函数参数T*& data,并获得与参数data相同的值。所以它得到一个新地址(例如"a34"),它的值是"v22"。

如果您想用函数更改指针指向的位置,只需将指针传递给指针即可。

编辑:添加的图形:链接这就是我的看法。我承认我对函数参数中的"*&"是新手,我更喜欢使用指针和指针对指针。

这是偶然的。如果删除一个数组,然后立即创建一个大小完全相同的新数组,则使用相同内存地址的可能性很高。另一种行为是正常的。