【问题标题】:Constant pointer variables in C++ [duplicate]C ++中的常量指针变量[重复]
【发布时间】:2011-08-27 18:29:50
【问题描述】:

可能重复:
What is the difference between const int*, const int * const, and int const *?

我知道C++ 中指针变量的两种变体。

说我有

mystruct{
    int num;
}

变体 1:

const mystruct* m1;表示m1中的成员变量不能修改,比如m1->num = 2会报错。

变体 2:

mystruct *const m2 = m1; 表示一旦将m2 设置为指向m1,再设置m2 =m3 就会产生错误。

但是,似乎还有第三种变体,我不确定以下的属性:

变体 3:

mystruct const * m3;

这是什么意思?

【问题讨论】:

  • 请注意,在版本 1 中,指针对象的成员无法使用该 m1 指针进行更改,而不是一般情况下无法更改。换句话说,没有说所指向的对象是常量……这个词仍然是相对于指针,意思是“不能用于书写”。跨度>
  • 投票结束,因为这是使用mystruct 而不是int 的完全重复保存。 :)

标签: c++ pointers constants


【解决方案1】:

变体 3 与变体 1 完全相同。const 适用于其 左侧 的任何内容。如果什么都没有(第一个变体),它适用于它正确的东西。此外,您还缺少一种变体。

const int* pi1; // varyable pointer to constant int
int const* pi2; // again - varyable pointer to constant int
int* const pi3; // constant pointer to varyable int
// you're missign the next
int const * const pi4; // constant pointer to constant int

我个人更喜欢第二个版本而不是第一个版本,因为这是编译器解析的内容,当您从右到左读取类型时,它会更清晰。 :) 另外,这就是我在 cmets 中所做的 - 直观,不是吗?

哦,是的,以上所有内容也适用于volatile。它们一起算作cv-qualifiers (cv = const volatile)。

最后一点,供将来参考:总是有cdecl.org。只要不混入 C++ 类型,就可以找出潜在的任何声明的含义。 编辑:有趣的是,int const i; 令人窒息。我想我需要研究是否在 C++ 中引入了 cv-qualifiers 的变量排序。

【讨论】:

    【解决方案2】:

    C++ 中的声明由两部分组成:

    decl-specifier-seq init-declarator-list ;

    decl-specifier-seq 是一系列关键字,如@9​​87654321@、constmutabletypedef 等……和一个类型。这些说明符的顺序无关紧要,所以你可以这样写:

    int typedef unsigned A;
    int const B = 1;
    

    它们是一样的

    typedef unsigned int A;
    const int B = 1;
    

    init-declarator-list 是您声明的实体的逗号分隔序列。这些实体中的每一个都获得了 decl-specifier-seq 的类型,并对其应用了一些修饰符:

    int typedef *A, B[10], *const C;
    

    这里 A 获取类型“指向 int 的指针”,B 是一个 int 数组,C 是一个指向 int 的常量指针。

    如您所见:

    mystruct const *m2 = m1;
    

    constdecl-specifier-seq 的一部分,因此它将 mystruct 修改为 const,而不是指针本身。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-14
      • 2023-04-07
      • 1970-01-01
      • 2014-02-23
      • 1970-01-01
      • 2012-04-22
      • 1970-01-01
      • 2021-04-19
      相关资源
      最近更新 更多