为什么按值传递指针后按引用传递指针指向原始内存位置?

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

我正在与 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)

由于文件中的数据类型也是unsigned char,一般只会改变指针内存地址(如果我使用getData)。但是,现在我希望这不会发生,但它确实发生了。

例如指针的原始内存地址(&ptr)= 0x000000000c840070,那么在wrap_getData函数内部数据指针内存地址(&ptr)是0x00000000002393e8,正如预期的那样不同,因为指针被复制。但是现在,当我通过引用将此指针传递给实际的 getData 函数时,内存地址 (&ptr) 又是 0x000000000c840070,这是我不希望的,我希望它保持 0x00000000002393e8,因为副本是通过引用传递的。为什么会这样?

你传入了指针。在该函数中,创建了一个新指针但显示给同一个对象。通过指针,可以在函数中更改该对象(指针指向的对象)。在函数之后,用函数创建的指针是 destroyed/freed。原始指针的内存位置始终保持不变,与指针指向的值相同。

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

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

如果你想用函数改变指针指向的位置,只需传入一个指向指针的指针。

编辑:添加绘图: link 这就是我的看法。我承认我对函数参数中的这个“*&”很陌生,我更喜欢使用指针和指向指针的指针。

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