我只想知道:数组是C变量还是常量?
我对char数组特别困惑。
最佳答案
根据C标准(6.3.2.1左值、数组和函数指示符)
1左值是表达式(对象类型不是void)
可能指定对象的;64)如果左值不
指定对象求值时,行为未定义。
当一个对象被称为具有特定类型时,该类型是
由用于指定对象的左值指定可修改的
左值是没有数组类型、没有
不完整的类型,没有constqualified类型,如果它是
结构或联合,没有任何成员(包括递归地,
所有包含的集合或联合体的任何成员或元素
constqualified类型。
所以数组是不可修改的左值。例如,你不能写
char s1[] = "hello";
char s2[] = "hello";
s1 = s2;
编译器将发出代码无效的诊断消息。
至于字符串文本,则它们具有静态存储持续时间,任何修改字符串文本的尝试都会导致未定义的行为。
来自C标准(6.4.5字符串文本)
7如果这些数组的
元素具有适当的值如果程序试图
修改这样的数组,行为是未定义的。
比较这两个代码片段。
char s[] = "hello";
s[0] = 'H';
和
char *s = "hello";
s[0] = 'H';
在第一个代码段中,声明了一个由字符串文字初始化的字符数组即字符串文本的字符用于初始化数组的元素。您可以更改创建的数组。
在第二个代码片段中,声明了一个指向strig文本的指针在第二条语句中,试图使用导致未定义行为的指针更改字符串文本。
至于诸如const限定符之类的限定符,则(6.7.3类型限定符)
9如果数组类型的规范包含任何类型
限定符,元素类型是这样限定的,而不是数组类型如果
函数类型的规范包括任何类型限定符
行为未定义
所以这个声明
const char s[] = "hello";
意味着数组的每个元素在其类型规范中都有限定符const,即每个元素都有类型
const char
。