【问题标题】:c++ const for pointer to pointerc++ const 用于指针
【发布时间】:2020-03-03 10:12:25
【问题描述】:

指向常量 int 的指针。我可以改变指针,但我不能改变值:

const int* a;

指向 int 的常量指针。我可能不会改变指针,但我可能会改变变量的值:

int* const a;

现在,如果我正在处理指向指针的指针,情况会如何?

int** a;

我该怎么做:

a) 声明一个 const 指针,指向一个非常量 int 的非常量指针

b) 声明一个非常量指针,指向一个非常量 int 的 const 指针

c) 声明一个指向 const int 的非常量指针的非常量指针 ?

【问题讨论】:

  • 我建议使用 typedef。很多类型定义。许多类型定义相互构建。足够多的类型定义,以至于你讨厌生活到这样的程度,以至于你在未来避免了这种愚蠢。是的,区别可能很重要。不,我从未见过重要的生产代码。
  • 公平地说:“我从来没有注意到重要的代码”,在我 20 多年的程序员职业生涯中,其中大部分时间都花在了 C++ 中。
  • 这更多是为了我对 const 正确性的理解,而不是为了编写生产代码。当我尝试用动态分配的 static char** foo 替换静态分配的 static const char* foo[1000] 并且编译器不允许我将字符串文字分配给 foo 的元素时,我确实偶然发现了它
  • const 关键字绑定到紧靠其左侧的事物。 (除非const 最先出现,在这种情况下,它会绑定到其右侧的事物。)

标签: c++ pointers constants const-correctness


【解决方案1】:

a) 声明一个const 指向非const 的指针指向非const int

int ** const a = nullptr;

请注意,由于上面的指针是const-qualified,因此必须在声明时对其进行初始化。否则无法编译。

b) 声明指向非const 的非const 指针指向非const int

int * const *b;   

c) 声明指向非const 的非const 指针指向const int

const int **c;

模式是,对于 const 指针:

T * const ptr; // const pointer to T

对于非const 指针:

T * ptr; // non-const pointer to T

然后,为最外层的指针选择上面的正确模式,并为最内层的指针(即埋在类型中最深的指针)相应地替换T

  • const 指向非const int: T = int * 的指针。
  • const 指向非const int: T = int * const 的指针。
  • const 指向const int: T = const int * 的指针。

【讨论】:

    【解决方案2】:

    这就是const相对于*的位置:如果const在左边,那么指向的是const,如果const*的右边,那么指的是const

    【讨论】:

      猜你喜欢
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多