【问题标题】:Difference between const char*, char const*, const char const* & string storageconst char*、char const*、const char const* 和字符串存储的区别
【发布时间】:2011-07-27 21:26:39
【问题描述】:

首先,有什么区别:

(1) const char*
(2) char const*
(3) const char const*

我很确定我完全理解这一点,但我希望有人给我一个句子,具体来说,所以它会留在我的脑海里。在有人把我放在现场然后它变得模糊之前,这是我很好的事情之一!

另外,编译器如何存储字符串字面量?这不是家庭作业,我只是在复习 C 以备面试,以防万一有人关心。

【问题讨论】:

标签: c++ string


【解决方案1】:
(1) const char* 
(2) char const* 

这是一个指针(您可以更改),指向您无法更改的字符(或多个字符)。换句话说,所有的字符串字面量。

(3) const char const*

这是双倍的。我想你是想争取第三个位置:

(4) const char * const

这是一个您无法更改的指针,指向您无法更改的字符(或多个字符)。您可以将其用于指向不应意外更改的文字的全局指针。

字符串文字将(很可能)集中在您的代码之后,通常在称为“rodata”的段或部分中。

【讨论】:

    【解决方案2】:

    1 和 2 是等价的,并且指定指向 const char 的指针的类型。指针本身不是 const。 3 无效,因为它重复了“const”。这就像说const const int。顺序不相关,所以也像说int const int

    在 C99 中,像这样重复 const 是有效的。但是在 C++ 中,你不能重复它。

    另外,编译器如何存储字符串字面量?

    它们以未指定的方式存储。但是允许编译器将它们存储在程序的只读部分中。所以你不能写字符串文字。您可以保证它们在整个程序生命周期内保持分配状态(换句话说,它们具有静态存储持续时间)。

    这不是家庭作业,我只是在复习 C 以备面试,以防有人关心。

    您应该了解 C 和 C++ 之间的细微差别。在 C99 中,如上所述,const const int 是允许的。在 C89 和 C++ 中,这是被禁止的。但是,在 C++ 中,如果应用于本身为 const 的 typedef,则可以引入冗余 const:

    typedef int const cint;
    cint const a = 0; // this const is redundant!
    

    模板参数也是如此。

    【讨论】:

      【解决方案3】:

      这里有很多正确的答案,但你可能会觉得很难记住,这里有一个记住这个的技巧:

      1> 当const在*左边时,表示指针指向一个常量对象;

      例如const int * p表示int不能通过指针p改变

      2> 当const在*右边时,表示指针是const指针;

      例如int * const p 表示 p 是一个不能更改的常量指针。

      顺便说一句,如果你在 * 的两边都有 const,那么这意味着它是一个 const 指针,你不能通过指针改变对象。

      例如int const * const p

      【讨论】:

        【解决方案4】:
        • const char *char const *含义相同:指向的值是const,但是指针本身可以改成另一个地址。初始化后,*p = 'X'; 无效(不编译),p = &x;(其中xchar 类型的变量)有效(编译)。

        • 所以const char const * 表示同一件事的两次。

        • char * const:指向的值可以改变,但指针本身是const。它不能被修改为指向另一个地址。初始化后*p = 'X';有效,p = &x;无效。

        • const char * constchar const * const 含义相同:指向的值和指针都是 const。 *p = 'X';p = &x; 在初始化后均无效。

        【讨论】:

          【解决方案5】:
          1. const char* 表示指向常量字符的指针
          2. char const* 的含义与 1 完全相同。(您可能会选择 char* const,它是指向字符的常量指针。)
          3. const char const* 无效,正如 Johannes 已经指出的那样

          字符串文字通常存储在可执行文件的只读数据段中,但这绝不是保证。

          【讨论】:

            【解决方案6】:
            1. const char * 指向常量char 数据的指针(从右到左读取)。

            2. 与 #1 相同。

            3. const char * const 常量指针(指针不可更改)指向常量数据(数据不可修改)。

            4. 字符串字面量通常存储在只读内存中,以“\0”结尾。 它们是指向常量数据的常量指针。

            【讨论】:

            • 字符串文字不是指针,它们是数组。考虑sizeof "foobar"
            猜你喜欢
            • 1970-01-01
            • 2013-04-23
            • 2018-11-05
            • 2010-10-27
            • 1970-01-01
            • 2012-04-07
            • 1970-01-01
            相关资源
            最近更新 更多