C++中的常量指针变量

7

可能是重复问题:
const int*,const int * const和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
请注意,在版本1中,意思是指不能使用m1指针更改指针对象的成员,而不是一般意义上的不能更改。换句话说,没有提到所指向的对象是常量... const仍然与指针相关,意思是“不能用于写入”。 - 6502
投票关闭,因为除了使用'mystruct'而不是'int'之外,这是完全重复的。 :) - Xeo
2个回答

8

第三种变体与第一种完全相同。 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;。我认为我需要研究一下 cv-qualifiers 的变量顺序是否是在 C++ 中引入的。


1

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

decl-specifier-seq init-declarator-list ;

其中,decl-specifier-seq是一系列关键字,例如volatileconstmutabletypedef等以及一个类型。这些限定符的顺序并不重要,因此您可以编写如下代码:

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得到了类型“指向整数的指针”,B是一个整数数组,C是一个整数常量指针。

正如您在您的情况中所看到的:

mystruct const *m2 = m1;

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接