繁体   English   中英

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

[英]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,因为副本是通过引用传递的。 为什么会这样?

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

那就是我所想的。 我可能已经读过你的问题太快了。

在调用getData(fileName, data); 指针data例如在地址“ a_17”上,其值例如“ v_22”,在调用该函数时,将创建函数参数T*& data ,并获得与参数data相同的值。 因此它将获得一个新地址(例如“ a_34”),其值为“ v_22”。

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

编辑:添加了图纸: 链接,这就是我的看法。 我承认我对函数参数中的“ *&”不熟悉,我更喜欢使用指针和指向指针的指针。

这是偶然的。 如果删除数组,然后立即制作一个大小完全相同的新数组,则机会很大,它将使用相同的内存地址。 其他行为是正常的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM