gpt4 book ai didi

c++ - const 指针(不是指向 const 的指针)和引用之间的功能区别是什么?

转载 作者:可可西里 更新时间:2023-11-01 15:10:12 25 4
gpt4 key购买 nike

我目前正在通过 C++ Primer 学习 C++,它解释了引用如何成为另一个变量名的别名。它还解释了指针如何指向另一个变量。它指出指针和引用之间的区别在于指针可以重新分配,而引用不能。

在下面的代码示例中,我可以用指针或引用做什么而不能用另一个做?

double pi = 3.14;
double &piRef = pi;
double *const piPnt = π

//both of these examples are valid and do the same thing
piRef = 3.14159;
*piPnt = 3.14159;

//however, if I attempt to reassign what the pointer points to, it is illegal.
//this is the same as with a reference, as a reference can't be reassigned either
double tau = 6.28;
piPnt = τ

我知道它们之间的内部差异(例如指针是对象,引用不是)。除了略有不同的语法之外,我感兴趣的是这些差异对程序员有何影响。因此,这不是 this 的拷贝已接受的答案仅讨论内部差异的问题。

最佳答案

从功能的角度来看,指针和引用确实是同一件事...它们引用一个对象而不是该对象的拷贝。

除了不能重新绑定(bind)引用之外,唯一真正的区别是指针可以为 NULL(即它可以不指向任何内容),而假定引用始终引用对象。

从技术上讲,您实际上可以得到一个不引用任何对象的引用(例如,将 *p 传递给一个需要引用的函数,其中 p 是空指针)但是这是“未定义的行为”。

换句话说,指针比引用更“灵活”,这允许编译器忽略

  • 引用可以改变它引用的对象
  • 引用不能有对象

在某些情况下,这可以产生更快的代码(但是对于第二点,取消引用空指针是未定义的行为,而不是运行时错误;因此,编译器没有义务生成在这种情况下执行某些特殊操作的代码:从代码生成的角度来看,指针实际上不能指向任何对象确实无关紧要,因为在程序员和编译器之间的契约中,这永远不会发生。

为重新绑定(bind)和具有 NULL 的额外灵 active 付出的“代价”是语法(有点无缘无故地)更烦人。

如果不能重新分配指针(因为指针本身是 const),那么除了更冗长但明确的语法外,没有任何实际差异。这是因为尽管是一个对象,const 声明的指针即使使用别名也无法更改

虽然从语法的角度来看,您可以获取 const 指针的地址,将该地址转换为非常量指针的地址并更改指向的值,这样的操作会是未定义的行为,无论发生什么(例如忽略赋值),如果将其告上法庭,编译器将是正确的:-)

关于c++ - const 指针(不是指向 const 的指针)和引用之间的功能区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32942219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com