首先,有什么区别:
(1) const char*
(2) char const*
(3) const char const*
我相当肯定我完全理解这一点,但我希望有人给我一个句子,特别是,所以它坚持我的头脑。这是我很好的事情之一,直到有人把我放到现场,然后它变得模糊!
此外,编译器如何存储字符串文字?这不是家庭作业,我只是在C上面试,以防万一有人关心。
答案 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
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;
(其中x
是char
类型的变量)有效(编译)。
所以const char const *
表示两次相同的事情。
char * const
:可以更改指向的值,但指针本身是const。它不能被修改为指向另一个地址。初始化后,*p = 'X';
有效,而p = &x;
则无效。
const char * const
和char const * const
具有相同的含义:指向的值和指针都是const。初始化后,*p = 'X';
和p = &x;
均无效。
答案 4 :(得分:1)
const char*
表示指向常量字符的指针char const*
表示与1.完全相同。(您可能会选择char* const
,这是指向字符的常量指针。)const char const*
无效,因为约翰内斯已经指出字符串文字通常存储在可执行文件的只读数据段中,但这绝不是保证。
答案 5 :(得分:1)
const char *
指向常量char
数据的指针(从右向左阅读)。
与#1相同。
const char * const
常量指针(指针不能更改)为常量数据(无法修改数据)。
字符串文字存储在只读存储器中,通常按原样存储,以'\ 0'结尾。 它们是常量数据的常量指针。