C ++中的常量指针变量

Constant pointer variables in C++

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What is the difference between const int*, const int * const, and int const *?

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

说我有

1
2
3
mystruct{
    int num;
}

变化1:

const mystruct* m1;表示M1中的成员变量不能修改,例如m1->num = 2会产生错误。

变化2:

mystruct *const m2 = m1;表示一旦m2设为m1点,如果以后再设m2 =m3点,就会产生错误。

但是,似乎还有第三种变化,我不确定:

变化3:

1
mystruct const * m3;

这是什么意思?


变量3与变量1完全相同。const适用于它左边的任何东西。如果没有任何东西(第一个变种),它适用于正确的事物。另外,您还缺少一个变体。

1
2
3
4
5
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;上窒息了。我想我需要研究CV限定符的变量排序是否在C++中引入。


请看这个链接。你会发现那里有更多的变化,并将学习阅读。原理很简单!


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

decl-specifier-seq init-declarator-list ;

decl说明符seq是一个关键字序列,如volatileconstmutabletypedef等。一种类型。这些说明符的顺序并不重要,因此您可以编写:

1
2
int typedef unsigned A;
int const B = 1;

它们和

1
2
typedef unsigned int A;
const int B = 1;

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

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

这里a获取类型"指向int的指针",b是int的数组,c是指向int的常量指针。

正如您在案例中看到的:

1
mystruct const *m2 = m1;

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