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

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

 const char* 

是一个指针,它的char元素不能被修改,但指针本身可以和

 char const* 

是一个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)错了?

实际上,按照标准, const将元素直接修改到左边 。 在声明开头使用const只是一个方便的心理捷径。 所以下面两个语句是等价的:

 char const * pointerToConstantContent1; const char * pointerToConstantContent2; 

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

 char * const constantPointerToMutableContent; 

为了保护指针和它指向的内容,使用两个const。

 char const * const constantPointerToConstantContent; 

我个人总是把const放在我不打算修改的部分之后,即使指针是我希望保持不变的部分,我也保持一致。

它工作,因为两者都是一样的。 可能是你在这个困惑,

 const char* // both are same char const* 

 char* const // unmutable pointer to "char" 

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

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

那是因为规则是:

规则: const绑定左边,除非左边没有东西,那么它绑定正确:)

所以,看看这些:

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

两个一样! 哦, --->><<---不是操作符,它们只是显示const绑定的内容。

(从2个简单的variables初始化问题 )

关于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 tfel-ot-thgir naem I hguohT:tidE

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

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

希望能帮助到你!

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

 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)所示。