我只想知道: C变量或常量中的数组是什么?
我对char数组特别困惑。
答案 0 :(得分:7)
根据C标准(6.3.2.1 Lvalues,数组和函数指示符)
1左值是一个表达式(对象类型不是void) 可能指定一个对象; 64)如果一个左值没有 在评估对象时指定对象,行为未定义。 当一个对象被称为具有特定类型时,类型是 由用于指定对象的左值指定。 可修改 左值是一个左值,没有数组类型,没有 不完整类型,没有constqualified类型,如果是a 结构或联合,没有任何成员(包括,递归, 所有包含聚合或联合的任何成员或元素) constqualified type。
因此数组是不可修改的左值。那你可能不会写例如
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
。
答案 1 :(得分:0)
数组定义:
与任何其他变量一样,未初始化的数组元素包含垃圾值。 数组是一组连续的内存位置,它们都具有相同的类型。要引用数组中的特定位置或元素,我们指定数组的名称和数组中特定元素的位置编号。
" C如何编程_ Deitel "书。
因为您可以看到数组是内存位置,因此您可以初始化它们并使它们成为常量,或者您可以将它们用作变量。
阵列指定:
就像变量定义一样。您应该指定它们的类型和名称及其长度(在这种情况下,它们与变量不同),例如int average[10]
是在其中存储10个变量的内存序列。
字符数组:
在C中 null_terminated 并始终以' / 0'结尾或者只是0.例如,如果要输入带有5个字符的名称,必须定义长度为5 + 1的数组(' \ 0')。如果您没有遇到未定义的行为(UB)。
您可以通过以下方式初始化数组:
char string[] ="computer"
char string[12]="algorthm"
char string[]={'s','t','a','c','k','/0'}