【问题标题】:const char* and char const* - are they the same?const char* 和 char const* - 它们是一样的吗?
【发布时间】:2011-12-26 20:47:15
【问题描述】:

据我了解,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)错误?

【问题讨论】:

  • 如有疑问,请始终使用Spiral Rule
  • "...其 char 元素可以修改,但指针本身可以,并且..." — 我认为您的意思是说“不能”那些“罐头”之一,但我不知道你有多困惑,所以我不知道要纠正哪个:P
  • 试试这个网站:www.cdecl.org
  • 编译器永远不会错;) span>

标签: c++ pointers constants


【解决方案1】:

其实按照标准,const直接修改元素到它的左边。在声明开头使用const 只是一种方便的思维捷径。所以下面两条语句是等价的:

char const * pointerToConstantContent1;
const char * pointerToConstantContent2;

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

char * const constantPointerToMutableContent;

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

char const * const constantPointerToConstantContent;

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

【讨论】:

  • 'convenient shorthand' 是一个有趣的描述,用于描述不短且不遵循正常规则的事物。
  • 该标准并不真正关心您使用的顺序。第 7.1.6 节只显示了这两个地方,并说只在一个地方使用它。
  • @beetstra 我同意。我将其更改为“方便的心理捷径”以更清楚一点。
【解决方案2】:

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

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*.它是指向char而不是char *的不可变指针。
【解决方案3】:

那是因为规则是:

规则:const 绑定左侧,除非左侧没有任何内容,否则绑定右侧:)

所以,看看这些:

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

两者都一样!哦,---&gt;&gt;&lt;&lt;--- 不是运算符,它们只是显示 const 绑定到的内容。

【讨论】:

  • 是的,正确的运算符是--&gt;&gt;,它只对值进行操作。试试int i = 8; std::cout &lt;&lt; (i --&gt;&gt; 1) &lt;&lt; std::endl; :)
【解决方案4】:

(来自2 simple variable initialization question

关于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

【讨论】:

  • +1 这太棒了,谢谢!多年来,我一直在努力理解const char* const 之类的东西,多亏了你,我现在明白了。
【解决方案5】:

这是我一直试图解释的方式:

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

希望对你有帮助!

【讨论】:

    【解决方案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?
    

    默认情况下,const 适用于紧邻左侧的内容,但如果前面没有任何内容,它可以适用于紧邻右侧的内容,如 (1) 中所示。

    【讨论】:

    • 最后一个:一个常量变量指针,一个常量指针,一个常量char。
    • 如果你所说的“常量变量指针”是指“常量指针”,那么你就搞定了兄弟!
    • 好吧,在 (5) 中,这是一个指向常量 char 的常量指针的变量指针,因为在标识符“x”之前的最后一个星号的右侧没有“const”。但在 (6) 中,它变成了一个常量指针,其余的保持不变。
    猜你喜欢
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 2012-07-21
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多