const char *和char const *-相同吗?


81

据我了解,const修饰语应从右至左阅读。从中我得到:

const char*

是一个指针,其char元素不能被修改,但是指针本身可以被修改,并且

char const*

mutablechar的常量指针。

但是,以下代码出现以下错误:

const char* x = new char[20];
x = new char[30];   //this works, as expected
x[0] = 'a';         //gives an error as expected

char const* y = new char[20];
y = new char[20];   //this works, although the pointer should be const (right?)
y[0] = 'a';         //this doesn't although I expect it to work

那么是哪一个呢?我的理解还是我的编译器(VS 2005)错误?


35
如有疑问,请始终使用螺旋尺
Alok保存

“ ...可以修改其char元素,但是指针本身可以修改,并且...” –我认为您是要对其中一个“可以”说“不能”,但是我不知道该怎么做感到困惑,所以我不知道要改正什么:P
不错2011年

1
尝试以下网站:www.cdecl.org
yasouser 2011年

编译器永远不会错;)
巨石

Answers:


129

实际上,根据标准,const直接在其左侧修改元素。const在声明的开头使用只是方便的快捷方式。因此,以下两个语句是等效的:

char const * pointerToConstantContent1;
const char * pointerToConstantContent2;

为了确保指针本身不被修改,const应在星号后放置:

char * const constantPointerToMutableContent;

为了保护指针及其指向的内容,请使用两个const。

char const * const constantPointerToConstantContent;

我个人一直将const放在我不想修改的部分之后,这样即使指针是我希望保持不变的部分,我也可以保持一致性。


23
“便捷速记”是对不短且不遵循正常规则的事物的有趣描述。
beetstra 2011年

该标准并不真正在乎您使用哪个订单。7.1.6节仅显示了两个地方,并说只能在一个地方使用它。
edA-qa mort-ora-y

1
@beetstra我同意。我将其更改为“便捷的心理捷径”,以便更加清楚。
格雷森,2012年

31

之所以有效,是因为两者相同。也许您对此感到困惑,

const char*  // both are same
char const*

char* const  // unmutable pointer to "char"

const char* const  // unmutable pointer to "const char"

[记住这一点,这是一个简单的规则,'*'首先会影响其整个LHS ]


好的,我明白了。非常感谢。
Luchian Grigore

1
unmutable pointer to char*这是指向charnot的不变指针char *
Alok保存

25

那是因为规则是:

RULE:const向左绑定,除非左边什么都没有,那么它向右绑定:)

因此,将其视为:

(const --->> char)*
(char <<--- const)*

都一样!哦,--->>并且<<---都没有的运营商,他们只是展示一下const结合到。


2
是的,正确的运算符为-->>,并且仅对值进行运算。试试int i = 8; std::cout << (i -->> 1) << std::endl;:)
Alexander Malakhov

11

(来自2个简单的变量初始化问题

关于以下方面的非常好的经验法则const

从右到左阅读声明。

(请参见Vandevoorde / Josutiss“ C ++模板:完整指南”)

例如:

int const x; // x is a constant int
const int x; // x is an int which is const

// easy. the rule becomes really useful in the following:
int const * const p; // p is const-pointer to const-int
int const &p;        // p is a reference to const-int
int * const * p;     // p is a pointer to const-pointer to int.

自从我遵循这种经验法则以来,我再也不会误解这些声明。

(:sisab retcarahc-rep a no ton,sisab nekot-rep a no tfel-ot-thgir naem I hguohT:tidE


+1太棒了,谢谢!多年来,我一直在努力寻求解决const char* const方案,感谢您,我现在能做到这一点。
OMGtechy

5

这是我一直尝试解释的方式:

char *p

     |_____ start from the asterisk. The above declaration is read as: "content of `p` is a `char`".

char * const p

     |_____ again start from the asterisk. "content of constant (since we have the `const` 
            modifier in the front) `p` is a `char`".

char const *p

           |_____ again start from the asterisk. "content of `p` is a constant `char`".

希望能帮助到你!


0

在两种情况下,您都指向常量char。

const char * x  //(1) a variable pointer to a constant char
char const * x  //(2) a variable pointer to a constant char
char * const x  //(3) a constant pointer to a variable char
char const * const x //(4) a constant pointer to a constant char
char const * const * x //(5) a variable pointer to a constant pointer to a constant char
char const * const * const x //(6) can you guess this one?

默认情况下,const适用于中间左侧的内容,但如果没有其他内容,则可以适用于右侧的中间内容,如(1)所示。


最后一个:常量变量指针,常量指针,常量char。
塞科

如果用“常量变量指针”表示“常量指针”,那么您就把它钉了!
Lino Mediavilla

好在(5)中,它是一个指向常量char的常量指针的变量指针,仅仅是因为在标识符“ x”之前的最后一个星号的右边没有“ const”。但是在(6)中变成常量指针,其余的保持不变。
Lino Mediavilla
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.