const char *,char const *,const char const *&字符串存储

时间:2011-07-27 21:26:39

标签: c++ string

首先,有什么区别:

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

我相当肯定我完全理解这一点,但我希望有人给我一个句子,特别是,所以它坚持我的头脑。这是我很好的事情之一,直到有人把我放到现场,然后它变得模糊!

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

6 个答案:

答案 0 :(得分:18)

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

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

(3) const char const*

这是加倍的。我认为你试图争取第三个位置:

(4) const char * const

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

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

答案 1 :(得分:7)

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,如果应用于本身为const的typedef:

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

模板参数也是如此。

答案 2 :(得分:7)

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

1> 当const位于*的左侧时,表示指针指向一个常量对象;

例如。const int * p表示无法通过指针p

更改int

2 - ; 当const位于*的右侧时,表示指针是一个const指针;

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

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

e.g。 int const * const p

答案 3 :(得分:6)

  • 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;均无效。

答案 4 :(得分:1)

  1. const char*表示指向常量字符的指针
  2. char const*表示与1.完全相同。(您可能会选择char* const,这是指向字符的常量指针。)
  3. const char const*无效,因为约翰内斯已经指出
  4. 字符串文字通常存储在可执行文件的只读数据段中,但这绝不是保证。

答案 5 :(得分:1)

  1. const char * 指向常量char数据的指针(从右向左阅读)。

  2. 与#1相同。

  3. const char * const 常量指针(指针不能更改)为常量数据(无法修改数据)。

  4. 字符串文字存储在只读存储器中,通常按原样存储,以'\ 0'结尾。 它们是常量数据的常量指针。