C ++中的常量指针变量

时间:2011-05-18 05:31:22

标签: c++ pointers constants

  

可能重复:
  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;

这是什么意思?

3 个答案:

答案 0 :(得分:7)

变体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

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

哦,是的,以上所有内容也适用于volatile。它们一起被计为cv-qualifierscv = const volatile)。

最后一点,未来的参考资料:总是cdecl.org。只要不混合使用C ++类型,就可以找到可能任何声明的含义。 修改:有趣的是,它在int const i;上窒息。我想我需要研究是否在C ++中引入了cv-qualifiers的变量排序。

答案 1 :(得分:3)

请见link。你会发现更多的变化,并将学会阅读。原理很简单!

答案 2 :(得分:1)

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

  

decl-specifier-seq init-declarator-list;

decl-specifier-seq是一系列关键字,例如volatileconstmutable typedef等......以及类型。这些说明符的顺序无关紧要,因此您可以写:

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;

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