const char*、char const*、const char const* 和字符串存储之间的区别
Difference between const char*, char const*, const char const* & string storage
首先,
(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;
(其中x
是char
类型的变量)有效(编译)。 -
所以
const char const *
表示两倍相同的东西。 -
char * const
:指针的值可以改变,但指针本身是const。它不能被修改为指向另一个地址。初始化后,*p = 'X';
有效,p = &x;
无效 -
const char * const
和char const * const
具有相同的含义:指向值和指针都是const。*p = 'X';
和p = &x;
初始化后都无效
-
const char*
表示指向常量字符的指针 -
char const*
的含义与1完全相同。(你可能会选择char* const
,这是一个指向字符的常量指针。) -
const char const*
无效,因为Johannes已经指出了
字符串字面值通常存储在可执行文件的只读数据段中,但这并不能保证。
-
const char *
指向char
常量数据的指针(从右向左读取) -
同#1
-
const char * const
常量指针(指针不能被改变)指向常量数据(数据不能被修改) -
字符串字面值通常按原样存储在只读内存中,以' '结尾。它们是指向常量数据的常量指针