可能重复:
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;
这是什么意思?
答案 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-qualifiers
(cv
= 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是一系列关键字,例如volatile
,const
,mutable
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,而不是指针本身。