我总是在const指针中混淆。 任何人都可以用简单的方式解释我的内容如下 代码片段试图说。我知道他们在说什么,但我需要理由 以简单的方式。谢谢
char *p="Hello"; /*pointer is variable,so string is*/
*p='M';
p="BYE"; /*works*/
p="Bye"; /*works*/
const char *q="Hello"; /*string is constant pointer is not */
*q='M'; /*Error*/
q="BYE"; /*works*/
char const *s="Hello"; /*string is constant pointer is not */
*s='M'; /*Error*/
s="BYE"; /*works*/
char* const t="Hello"; /*pointer is constant string is not */
*t='M'; /*works*/
t="BYE"; /*error*/
const char* const u="Hello"; /*string is constant,so is pointer*/
*u='M'; /*error*/
u="BYE"; /*error*/
答案 0 :(得分:0)
实际上这三个代码段
char *p="Hello"; /*pointer is variable,so string is*/
*p='M';
p="BYE"; /*works*/
p="Bye"; /*works*/
const char *q="Hello"; /*string is constant pointer is not */
*q='M'; /*Error*/
q="BYE"; /*works*/
char const *s="Hello"; /*string is constant pointer is not */
*s='M'; /*Error*/
s="BYE"; /*works*/
在某种意义上是等效的,你可能不会改变指针所指向的对象。区别在于将限定符const添加到q的定义允许编译器在编译时找到错误。
您不能修改字符串文字。任何修改字符串文字的尝试都会导致程序的未定义行为。在C字符串中,文字具有非const字符数组的类型。但是,在第二个代码片段中添加限定符const允许编译器在编译时找到错误。
C标准(6.4.5字符串文字)
7未指明这些阵列是否与它们不同 元素具有适当的值。 如果程序尝试 修改这样的数组,行为是未定义的。
除了记录之间的审美之外没有区别
const char *
和
char const *
两者都定义了指向常量对象的指针。指针本身并不是一成不变的。
但是如果你要写下面的方式
char s[] ="Hello"; /*pointer is variable,so string is*/
char *p = s;
const char *q = s;
*p='M';
*q='M';
然后使用带或不带const限定符的指针之间存在差异,因为您可能会更改字符数组。对于最后一个语句,编译器将发出错误。
最后两个代码片段与前三个代码片段的不同之处在于,后两个定义的常量指针可能不会更改指针的值。然后你试图重新分配编译器发出错误的常量指针。常量对象在定义时应初始化。