首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >常量char*、char常量*、常量char常量*与字符串存储的区别

常量char*、char常量*、常量char常量*与字符串存储的区别
EN

Stack Overflow用户
提问于 2011-07-28 05:26:39
回答 6查看 15.1K关注 0票数 13

首先,这两者有什么不同:

代码语言:javascript
复制
(1) const char*
(2) char const*
(3) const char const*

我相当确定我完全理解这一点,但我希望有人给我每一句话,特别是,这样它就会留在我的脑海里。这是我可以接受的事情之一,直到有人把我放在现场,然后它变得模糊!

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-07-28 05:28:35

1和2等效,并指定指向常量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:

代码语言:javascript
复制
typedef int const cint;
cint const a = 0; // this const is redundant!

模板参数也是如此。

票数 10
EN

Stack Overflow用户

发布于 2011-07-28 05:30:54

代码语言:javascript
复制
(1) const char* 
(2) char const* 

这是一个指向不能更改的字符(或多个字符)的指针(可以更改)。换句话说,所有的字符串文字。

代码语言:javascript
复制
(3) const char const*

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

代码语言:javascript
复制
(4) const char * const

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

字符串文字将(最有可能)集中在代码后面,通常位于称为"rodata“的段或部分中。

票数 20
EN

Stack Overflow用户

发布于 2011-07-28 05:52:48

这里有相当多的正确答案,但你可能会发现很难记住,这里有一个记住这个的诀窍:

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

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

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

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

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

例如int const * const p

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6851436

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档