const char*、char const*、const char const* 和字符串存储之间的区别

Difference between const char*, char const*, const char const* & string storage

本文关键字:const char 区别 之间 字符串 存储      更新时间:2023-10-16

首先,

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

我很确定我完全理解这一点,但我希望有人能给我一个句子,具体地说,这样它就会留在我的脑海里。这是我能接受的事情之一,直到有人把我放在现场,然后就变得模糊了!

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

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

这是一个指针(你可以改变)到一个字符(或多个字符),你不能改变。换句话说,所有字符串字面值。

(3) const char const*

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

(4) const char * const

是一个不能改变的指针,指向一个不能改变的字符(或多个字符)。您可以将此用于指向不应意外更改的字面值的全局指针。

字符串字面值将(很可能)集中在代码后面,通常在称为"rodata"的段或节中。

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 int const cint;
cint const a = 0; // this const is redundant!

同样适用于模板参数。

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

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

const int * p意味着int不能通过指针p

改变

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

int * const p表示p是一个常量指针,不能被修改

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

int const * const p

  • 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;初始化后都无效

  1. const char*表示指向常量字符的指针
  2. char const*的含义与1完全相同。(你可能会选择char* const,这是一个指向字符的常量指针。)
  3. const char const*无效,因为Johannes已经指出了

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

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

  2. 同#1

  3. const char * const常量指针(指针不能被改变)指向常量数据(数据不能被修改)

  4. 字符串字面值通常按原样存储在只读内存中,以''结尾。它们是指向常量数据的常量指针