声明一个常量字符串时,是整个字符串read-only
还是只是初始字符?
const char* s = "hello";
答案 0 :(得分:5)
"hello"
是一个字符串文字。字符串文字对象是char
数组类型,由C指定为不可修改。这意味着尝试修改它会调用未定义的行为。
const char* s = "hello";
现在,上面的声明s
是指向字符串文字对象"hello"
的指针。它指向字符串的第一个字符。通过将其限定为const
,您向编译器做出承诺,即您不会使用s
指针来修改它所指向的内容。
s
上的任何指针算术通过添加整数值也会产生const char *
。例如,s + 1
也是const char *
,因此您无法使用s + 1
修改其指向的内容,例如s[1] = 0
(或等效的*(s + 1) = 0
)无效。
答案 1 :(得分:0)
相对于此定义
const char* s = "hello";
然后指针定义为指向const char类型的对象。所以指针指向的对象,在这种情况下,它是字符串文字的第一个字符可能不会被更改。
考虑到您可以重新指定指针。例如
const char* s = "hello";
//...
char c = 'A';
s = &c;
尽管具有名称c的对象本身不是常量对象,但是指针s指向具有限定符const的指针,并且假设它指向const数据并且您可能不使用此指针来更改对象。
另一方面,虽然C中的字符串文字本身具有(非常量)字符数组的类型,但即使您将声明这样的指针,也可能无法更改它们
char* s = "hello";
任何修改字符串文字的尝试都会导致未定义的行为。允许实现将字符串文字放在只读存储器中。