2015-03-02 84 views
-2

当声明一个常量字符串时,是整个字符串read-only还是只是初始字符?它只是const char *的第​​一个字符是常量吗?

const char* s = "hello"; 
+2

整个字符串(即使没有'const'),字符串文字通常放在只读段中。 – 2015-03-02 18:59:20

+0

此外,C没有字符串...只是char数组或字符指针。 – ForceBru 2015-03-02 18:59:56

+5

@ForceBru:每个人都会调用这些东西(C)字符串。 – 2015-03-02 19:00:28

回答

4
"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)无效。

0

相对于该定义

const char* s = "hello"; 

然后指针定义这样一种方式,它指向类型为const char的对象。所以指针指向的对象,在这种情况下,它是字符串文字的第一个字符可能不会被改变。

考虑到您可以重新分配指针。例如

const char* s = "hello"; 

//... 
char c = 'A'; 
s = &c; 

虽然与名称C的对象不是一个常量对象本身仍然是指针指向s的标识const,并假设它指向const的数据,你可能无法使用该指针改变对象。

在另一方面,虽然字符串字面本身使用C具有类型(非const)字符数组,你可能不会改变他们,即使你将宣布指针这样

char* s = "hello"; 

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

相关问题