微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我可以在从堆中获取内存时更改 const int** 类型中 int* 的值

如何解决为什么我可以在从堆中获取内存时更改 const int** 类型中 int* 的值

const 限定符有一些问题。 我试着这样做:

int a{ 3 };
int *p{ &a };
//const int **pp{ &p }; // FIXME: Compiler demands that p must have a const int *type
const int *const* pp{ &p }; // works here but it means,that I have a pointer to the const pointer to the const value
*pp = nullptr; // doesn't work cause of upper type

导致错误

<source>:8:5: error: read-only variable is not assignable
*pp = nullptr; // doesn't work cause of upper type
~~~ ^

但是:如果我处理 new,它会很有趣

const int **pp1{ new const int* {&p} }; // Here I have a poiner to pointer to const int,so I can change it
*pp1 = nullptr; // works

那么,为什么编译器需要一个 const int* const*?编译器 - MSVC,标准 - c++17

更新:

const int *p{ nullptr };
const int **pp{ &p }; // My intention
*pp = nullptr; // it works cause pointer non - const

但是如何在 const int *p 中没有 const 的情况下获得相同的结果?

解决方法

在某些情况下,此站点 https://cdecl.org/ for C 语法也可以帮助使用 C++。为此:

const int *const* pp 

它告诉我:

将pp声明为指向const int的const指针

为此:

const int **pp1

它告诉我:

将 pp1 声明为指向 const int 的指针

让我们使用它......

*pp = ... // ERROR !

当您取消引用 pp 时,您会得到一个“指向 const int 的 const 指针”(因为 pp 是“指向指向 const int 的 const 指针的指针”)。您不能分配给 const whatever。什么算顶级const

*pp1 ... // OK !?!

当您取消引用 pp1 时,您会得到一个“指向 const int 的指针”(因为 pp1 是一个“指向指向 const int 的指针的指针”)。指向 const int 的指针不是常量。重要的是顶级const!它指向一个 const int 但指针本身不是 const

结论:您的两个版本之间的区别不在于 new 的使用,而是您取消引用的指针类型(然后尝试分配给指针对象)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。