提问人:Luchian Grigore 提问时间:11/11/2011 最后编辑:PuppyLuchian Grigore 更新时间:10/30/2017 访问量:39687
const char* 和 char const* - 它们是一样的吗?
const char* and char const* - are they the same?
问:
根据我的理解,修饰符应该从右到左阅读。从中,我明白: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)是错误的吗?
答:
它之所以有效,是因为两者都是相同的。可能你对此感到困惑,
const char* // both are same
char const*
和
char* const // unmutable pointer to "char"
和
const char* const // unmutable pointer to "const char"
[为了记住这一点,这里有一个简单的规则,“*”首先影响其整个LHS]
评论
unmutable pointer to char*
.它是一个指向 not 的不可变指针。char
char *
这是因为规则是:
规则:绑定左边,除非左边什么都没有,否则它绑定右边:)const
因此,请将这些视为:
(const --->> char)*
(char <<--- const)*
两者都一样!哦,而且不是运算符,他们只是显示绑定的内容。--->>
<<---
const
评论
-->>
int i = 8; std::cout << (i -->> 1) << std::endl;
实际上,根据标准,直接修改元素的左侧。在声明的开头使用只是一个方便的心理捷径。所以以下两个语句是等价的:const
const
char const * pointerToConstantContent1;
const char * pointerToConstantContent2;
为了保证指针本身不被修改,应放在星号后面:const
char * const constantPointerToMutableContent;
若要保护指针及其指向的内容,请使用两个常量。
char const * const constantPointerToConstantContent;
我个人采用始终将常量放在我不打算修改的部分之后,这样即使指针是我希望保持不变的部分,我也能保持一致性。
评论
以下是我总是试图解释的方式:
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`".
希望对您有所帮助!
(摘自 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
评论
const char* const
在这两种情况下,您都指向一个常量字符。
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
评论