const char*,char const*,const char const*&string storage之间的区别

Joh*_*0te 11 c++ string

首先,它们之间的区别是什么:

(1) const char*
(2) char const*
(3) const char const*
Run Code Online (Sandbox Code Playgroud)

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

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

das*_*ndy 19

(1) const char* 
(2) char const* 
Run Code Online (Sandbox Code Playgroud)

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

(3) const char const*
Run Code Online (Sandbox Code Playgroud)

这是加倍的.我想你想要争取第三个位置:

(4) const char * const
Run Code Online (Sandbox Code Playgroud)

这是一个你无法改变的指针,一个你无法改变的char(或多个chars).您可以将此用于指向不应意外更改的文字的全局指针.

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


Joh*_*itb 8

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!
Run Code Online (Sandbox Code Playgroud)

模板参数也是如此.


Gob*_*0st 7

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

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

例如,const int * p意味着无法通过指针p更改int

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

例如,int * const pp是一个不能改变的常量指针.

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

例如 int const * const p


Shl*_*blu 6

  • const char *char const *具有相同的含义:指向的值是const,但指针本身可以更改为另一个地址.初始化后,*p = 'X';无效(不编译)和p = &x;(其中x是类型的变量char)有效(它编译).

  • 所以const char const *表示两次相同的事情.

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

  • const char * const并且char const * const具有相同的含义:指向的值和指针都是const.初始化后既不有效*p = 'X';p = &x;无效.