首先,它们之间的区别是什么:
(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"的段或部分中.
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)
模板参数也是如此.
这里有很多正确的答案,但你可能会发现很难记住,这是一个记住这个的技巧:
1>当const位于*的左侧时,表示指针指向一个常量对象;
例如,const int * p
意味着无法通过指针p更改int
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;
无效.
归档时间: |
|
查看次数: |
13639 次 |
最近记录: |