【问题标题】:Const array pointer to const values指向 const 值的 const 数组指针
【发布时间】:2012-08-04 18:11:46
【问题描述】:

如果我创建一个 const 值的全局数组,例如

const int SOME_LIST[SOME_LIST_SIZE] = {2, 3, 5, 7, 11};

可以以任何方式修改 SOME_LIST 吗?

如何编写这样的 SOME_LIST 指向一个 const 内存位置,并且本身就是一个 const 指针(即不能指向其他地方)?

【问题讨论】:

  • SOME_LIST 无论如何都不能修改
  • SOME_LISTan array, not a pointer,所以只需要担心一层常量。

标签: c++ arrays constants const-correctness


【解决方案1】:

有 3 个主要的指针示例涉及“const”关键字。 (见link

首先:声明一个指向常量变量的指针。指针可以移动,可以改变它指向的东西,但是不能修改变量。

const int* p_int;

其次:声明一个指向变量的“不可移动”指针。指针是“固定的”,但可以修改数据。这个指针必须被声明和赋值,否则它可能指向 NULL,并固定在那里。

int my_int = 100;
int* const constant_p_int = &my_int;

第三:声明一个指向常量数据的不可移动指针。

const int my_constant_int = 100; (OR "int const my_constant_int = 100;")
const int* const constant_p_int = &my_constant_int;

你也可以用这个。

int const * const constant_p_int = &my_constant_int;

另一个很好的参考请参阅here。我希望这会有所帮助,虽然在写这篇文章时我意识到你的问题已经得到了回答......

【讨论】:

  • 我很熟悉 const 在指针上的使用,它只是我不确定的数组。仍然非常好的事情要知道。 :)
  • 是的,我最近才开始了解它,所以我想我可以分享一下(:
【解决方案2】:

你拥有它的方式是正确的。

另外,您不需要提供SOME_LIST_SIZE; C++ 会从初始化程序中自动计算出来。

【讨论】:

  • 只是为了确认一下,如果我试图将它指向其他地方或 memset 它,会引发编译器错误?
  • @Darthfett:是的,会的。特别恶意的人可能可以在上面使用const_cast,但作为一个非指针,我相当肯定这是在涉足未定义的行为领域。
  • 当然:数组不能重定位,memset 会抱怨你给它一个const 指针。显然,您可以使用 const_cast 绕过最后的保护,但随后您会进入 UB-land(它可能会导致运行时崩溃)。
  • const int SOME_LIST[] 在传递给函数时衰减为 const int *。 OP 不是要求一种方法来定义 SOME_LIST[] 以使其衰减到 const int * const 吗?
猜你喜欢
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多