Const char*和char Const *是一样的吗?
const char* and char const* - are they the same?
根据我的理解,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个简单变量初始化问题)
关于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 tfelt - not - their - girl name)
我总是这样解释:
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)所示。