Const char*和char Const *是一样的吗?

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

本文关键字:Const char 一样      更新时间:2023-10-16

根据我的理解,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)所示。