Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是否只有常量字符*的第一个字符是常量?_C - Fatal编程技术网

C 是否只有常量字符*的第一个字符是常量?

C 是否只有常量字符*的第一个字符是常量?,c,C,声明常量字符串时,整个字符串是只读的还是仅为初始字符 const char* s = "hello"; 是字符串文字。string literal对象是char数组类型,并由C指定为不可修改。这意味着试图修改它会调用未定义的行为 const char* s = "hello"; 现在,上面的声明是一个指向字符串文本对象的指针“hello”。它指向字符串的第一个字符。通过将其限定为const可以向编译器保证,不会使用s指针修改它指向的内容 s上的任何指针算术,只要将其加上一个整数值,就会产生

声明常量字符串时,整个字符串是只读的还是仅为初始字符

const char* s = "hello";
是字符串文字。string literal对象是
char
数组类型,并由C指定为不可修改。这意味着试图修改它会调用未定义的行为

 const char* s = "hello";
现在,上面的声明是一个指向字符串文本对象的指针
“hello”
。它指向字符串的第一个字符。通过将其限定为
const
可以向编译器保证,不会使用
s
指针修改它指向的内容


s
上的任何指针算术,只要将其加上一个整数值,就会产生一个
const char*
。例如,
s+1
也是一个
const char*
,因此您不能使用
s+1
修改它所指向的内容,例如
s[1]=0
(或等效的
*(s+1)=0
)无效。

相对于此定义

const char* s = "hello";
然后指针定义为指向const char类型的对象。因此,指针指向的对象(在本例中,它是字符串文本的第一个字符)可能不会更改

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

const char* s = "hello";

//...
char c = 'A';
s = &c;
虽然名为c的对象本身不是常量对象,但它是由带有限定符const的指针s指向的,并且假定它指向const数据,您不能使用此指针更改对象

另一方面,尽管C中的字符串文字本身具有(非常量)字符数组的类型,但即使您将这样声明指针,也不能更改它们

char* s = "hello";

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

整个字符串(即使没有
const
),字符串文本通常放在只读段中。@ForceBru:所有人都称这些东西为(C)字符串。@ForceBru:你说得对,现在你已经提到了,柏拉图也没有称它们为字符串。我真傻。@ForceBru它们在整个标准中都被称为“字符串文字”。@zubergu:不是真的。如果通过指针访问,它会使指向的对象不可变。是的,字符串文本是不可变的,但是省略
const
将是程序员的错误。
char* s = "hello";