const char* 和 char const* - 它们是一样的吗?

const char* and char const* - are they the same?

提问人:Luchian Grigore 提问时间:11/11/2011 最后编辑:PuppyLuchian Grigore 更新时间:10/30/2017 访问量:39687

问:

根据我的理解,修饰符应该从右到左阅读。从中,我明白:const

const char*

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

char const*

是指向 chars 的常量指针。mutable

但是我收到以下代码的以下错误:

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)是错误的吗?

C++ 指针 常量

评论

36赞 Alok Save 11/11/2011
如有疑问,请始终使用螺旋法则
0赞 detly 11/12/2011
“......其 char 元素可以修改,但指针本身可以修改,并且......”— 我想你的意思是说“不能”其中一个“可以”,但我不知道你有多困惑,所以我不知道该纠正哪个:P
1赞 yasouser 12/15/2011
试试这个网站: www.cdecl.org
0赞 monolith 3/29/2018
编译器永远不会出错;)

答:

32赞 iammilind 11/11/2011 #1

它之所以有效,是因为两者都是相同的。可能你对此感到困惑,

const char*  // both are same
char const*

char* const  // unmutable pointer to "char"

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

[为了记住这一点,这里有一个简单的规则,“*”首先影响其整个LHS]

评论

0赞 Luchian Grigore 11/11/2011
好的,我现在明白了。多谢。
1赞 Alok Save 11/11/2011
unmutable pointer to char*.它是一个指向 not 的不可变指针。charchar *
28赞 Akanksh 11/11/2011 #2

这是因为规则是:

规则:绑定左边,除非左边什么都没有,否则它绑定右边:)const

因此,请将这些视为:

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

两者都一样!哦,而且不是运算符,他们只是显示绑定的内容。--->><<---const

评论

2赞 Alexander Malakhov 12/15/2011
是的,正确的运算符是,它只对值进行操作。试用:)-->>int i = 8; std::cout << (i -->> 1) << std::endl;
134赞 Greyson 11/11/2011 #3

实际上,根据标准,直接修改元素的左侧。在声明的开头使用只是一个方便的心理捷径。所以以下两个语句是等价的:constconst

char const * pointerToConstantContent1;
const char * pointerToConstantContent2;

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

char * const constantPointerToMutableContent;

若要保护指针及其指向的内容,请使用两个常量。

char const * const constantPointerToConstantContent;

我个人采用始终将常量放在我不打算修改的部分之后,这样即使指针是我希望保持不变的部分,我也能保持一致性。

评论

24赞 beetstra 11/11/2011
“方便的速记”是一个有趣的描述,它不短,不遵循正常规则。
0赞 edA-qa mort-ora-y 11/11/2011
标准并不真正关心你使用哪个顺序。第 7.1.6 节只显示了这两个地方,并说只在一个地方使用它。
1赞 Greyson 5/4/2012
@beetstra我同意。为了更清楚,我把它改成了“方便的心理捷径”。
5赞 yasouser 11/18/2011 #4

以下是我总是试图解释的方式:

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`".

希望对您有所帮助!

13赞 Sebastian Mach 6/22/2012 #5

(摘自 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

评论

0赞 OMGtechy 7/31/2014
+1 这太棒了,谢谢!多年来,我一直在努力解决诸如此类的事情,多亏了你,我现在明白了。const char* const
0赞 Lino Mediavilla 10/30/2017 #6

在这两种情况下,您都指向一个常量字符。

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?

默认情况下,它适用于左边的右边,但如果前面没有任何东西,它可以应用于右边右边的右边,如 (1) 所示。const

评论

0赞 Secko 2/2/2019
最后一个:常量变量指针,常量指针,常量字符。
0赞 Lino Mediavilla 2/4/2019
如果“常量变量指针”的意思是“常量指针”,那么你就搞定了兄弟!
0赞 Lino Mediavilla 2/5/2019
好吧,在 (5) 中,这是一个指向常量 char 的常量指针的变量指针,仅仅是因为标识符 “x” 之前最后一个星号的右边没有 “const”。但在(6)中,它变成了一个常量指针,其余部分保持不变。