【问题标题】:const qualifier in c++ in array of pointers指针数组中的 C++ 中的 const 限定符
【发布时间】:2016-01-09 07:08:51
【问题描述】:

假设我有一个指向整数的指针数组(即每个元素都是一个指向 int 的指针)

int** ptrArray;

并且我想防止更改数组条目所指向的整数

我需要把 const 放在哪里?

1. const int ** ptrArray
2. int const ** ptrArray
3. int *const*  ptrArray
4. int ** const ptrArray

这有什么规则吗? 比如“第一个 const 保护数据”、“第二个 const 保护指针”等等?

const 的位置背后有什么逻辑吗? 放置位置和保护对象之间有什么联系吗?

这对我来说是一个非常令人困惑的问题,如果有人可以给我任何指南或链接,我可以根据我想要保护的内容阅读更多关于如何以及在何处使用 const 的信息(如果我需要在 3 维数组中使用 const 左右)

【问题讨论】:

  • "我有一个指向整数的指针数组" 你实际上拥有的是一个指向 int 的指针。
  • 是的,我知道。但这与问题有什么关系?
  • 这与您对数组和指针(以及更普遍的语言)的理解绝对相关,这是问题及其答案的关键组成部分。不要耸耸肩。如果您“知道”,请不要在问题中弄错!
  • 那你就知道错了。注意。数组不是指针(尽管有时这种语言可能会让人感到困惑。)
  • juanchopanza 我被教导说数组是一个指针......你能澄清一下你说“数组不是指针”的意思吗?

标签: c++ arrays pointers constants


【解决方案1】:

这有什么规则吗?比如“第一个 const 保护数据”、“第二个 const 保护指针”等等?

是:const 适用于左侧,除非那里没有任何内容,否则适用于右侧。

因此,这个:

int const** ptrArray;

但是,作为一种特殊情况,这是等价的:

const int** ptrArray;

这意味着常见的模式const int x;实际上int const x;伪装的。

【讨论】:

    【解决方案2】:

    你从变量开始读取修饰符。

    例如

    3. int *const*  ptrArray
    
    • ptrArray 是一个变量。
    • *ptrArray 表示指向某物的指针
    • const* ptrArray 表示指向常量的指针
    • *const* ptrArray 表示指向某事物的常量指针的指针

    所以int *const* ptrArray; 声明了一个指向常量的指针,该指针指向一个(非常量)int


    要理解所有示例,您需要知道的最后一个技术细节是 int constconst int 是表示同一类型的两种不同方式。

    【讨论】:

      【解决方案3】:

      http://cdecl.org 报告(或多或少,一个是无效的语法错误):

      const int ** ptrArray:  declare ptrArray as pointer to pointer to const int
      int const ** ptrArray:  declare ptrArray as pointer to pointer to const int
      int * const * ptrArray: declare ptrArray as pointer to const pointer to int
      int ** const ptrArray: declare ptrArray as const pointer to pointer to int
      

      所以您正在寻找以下任何一种:

      const int ** ptrArray
      int const ** ptrArray
      

      【讨论】:

        猜你喜欢
        • 2016-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-24
        • 1970-01-01
        • 2012-08-04
        相关资源
        最近更新 更多