根据C标准(6.3.2.1 Lvalues,数组和函数指示符)
1左值是一个表达式(对象类型不是void)可能指定一个对象; 64)如果左值在评估时没有指定对象,则行为是未定义的.当一个对象被称为具有特定类型时,该类型由用于指定该对象的左值指定.可修改的左值是一个左值,它没有数组类型,没有不完整的类型,没有constqualified类型,如果是结构或联合,则没有任何成员(包括,递归地,任何成员或元素)所有包含的聚合或联合)具有constqualified类型.
所以数组是不可修改的左值.那就是你可能不会写的例子
char s1[] = "hello";
char s2[] = "hello";
s1 = s2;
Run Code Online (Sandbox Code Playgroud)
编译器将发出代码无效的诊断消息.
至于字符串文字,那么它们具有静态存储持续时间,并且任何修改字符串文字的尝试都会导致未定义的行为.
来自C标准(6.4.5字符串文字)
7如果这些数组的元素具有适当的值,则这些数组是否不同是未指定的.如果程序试图修改此类数组,则行为未定义.
比较这两个代码片段.
char s[] = "hello";
s[0] = 'H';
Run Code Online (Sandbox Code Playgroud)
和
char *s = "hello";
s[0] = 'H';
Run Code Online (Sandbox Code Playgroud)
在第一个代码片段中,声明了一个由字符串文字初始化的字符数组.也就是说,字符串文字的字符用于初始化数组的元素.你可以改变创建的数组.
在第二个代码片段中,声明了一个指向strig文字的指针.在第二个语句中,尝试使用导致未定义行为的指针来更改字符串文字.
至于像const限定符那样的限定符(6.7.3类型限定符)
9 如果数组类型的规范包含任何类型限定符,则元素类型是限定的,而不是数组类型.如果函数类型的规范包括任何类型限定符,则行为是未定义的
所以这个宣言
const char s[] = "hello";
Run Code Online (Sandbox Code Playgroud)
表示数组的每个元素在其类型规范中都有限定符const,每个元素都具有该类型const char.
| 归档时间: |
|
| 查看次数: |
142 次 |
| 最近记录: |