取消引用指针会复制它吗?
Posted
技术标签:
【中文标题】取消引用指针会复制它吗?【英文标题】:Does dereferencing a pointer make a copy of it? 【发布时间】:2011-05-25 02:55:13 【问题描述】:是否取消引用指针并将其传递给通过引用获取其参数的函数会创建对象的副本?
【问题讨论】:
回复:标题。如果取消引用指针会生成对象的副本,那不是永远不可能使用该对象吗?! 【参考方案1】:在这种情况下,指针处的值被复制(尽管这不一定是因为优化器可能会优化它)。
int val = *pPtr;
在这种情况下,不会发生复制:
int& rVal = *pPtr;
没有发生复制的原因是因为引用不是机器代码级别的构造。它是一个更高级别的构造,因此是编译器在内部使用的东西,而不是为其生成特定代码。
显然,函数参数也是如此。
【讨论】:
第一种情况下复制的不是指针。复制的是它指向的值。在第二种情况下,指针被复制(逻辑上)并且值不是。 我写了一个简单的测试程序来验证自己的答案,希望对codepad.org/XDqahndf有所帮助 所以有了 rVal,我们仍然可以在没有副本的情况下读取该内存位置的内容,对吧? 没错。当然,如果原始值超出范围,您现在正在读取随机内存......【参考方案2】:在简单的情况下,不。不过,还有更复杂的情况:
void foo(float const& arg);
int * p = new int(7);
foo(*p);
这里创建了一个临时对象,因为解引用指针的类型 (int
) 与函数参数的基本类型 (float
) 不匹配。存在转换序列,转换后的临时值可以绑定到 arg
,因为这是一个 const 引用。
【讨论】:
【参考方案3】:希望它不会:如果被调用函数按值获取其参数,它会。
此外,这是引用的预期行为:
void inc(int &i) ++i;
int main()
int i = 0;
int *j = &i;
inc(*j);
std::cout << i << std::endl;
此代码应打印1
因为 inc
通过引用获取其参数。如果在inc
调用时制作了副本,代码将打印0
。
【讨论】:
【参考方案4】:没有。引用或多或少就像具有不同表示法的指针以及没有空引用的限制。但就像指针一样,它只包含对象的地址。
【讨论】:
"但是就像一个指针,它只包含一个对象的地址。"引用本身并不存在。它只是它被初始化的对象的别名。所以说“它包含”地址是错误的。引用只是指向与原始对象相同的地址,它不包含该地址。 为什么不呢?它怎么能指向某个地方而不包含地址?它确实包含它,只是您无法访问它包含的地址,因为它会在您访问它时自动取消引用。 @Sergey Tachenov:编译器必须创建它是别名的虚构,并且可以假设它。这意味着根据用途,编译器可以创建一个 internal 指针并在使用时自动取消引用它,或者在某些情况下它可以完全引用原始对象。在大多数情况下,它不得不求助于指针,但归根结底,最好还是抽象地思考:引用是别名,不管它们是如何实现的。 在某些情况下,最好将引用作为其他变量的别名。但是,如果您有“包含”引用的引用参数或变量,则很难以这种方式想象它们。此示例输出 8:#include以上是关于取消引用指针会复制它吗?的主要内容,如果未能解决你的问题,请参考以下文章