它只是const char *的第​​一个字符是不变的吗?

时间:2015-03-02 18:58:19

标签: c

声明一个常量字符串时,是整个字符串read-only还是只是初始字符?

const char* s = "hello";

2 个答案:

答案 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";

任何修改字符串文字的尝试都会导致未定义的行为。允许实现将字符串文字放在只读存储器中。