是数组变量还是常量?

时间:2017-07-21 11:32:33

标签: c arrays pointers variables constants

我只想知道: C变量或常量中的数组是什么?

我对char数组特别困惑。

2 个答案:

答案 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'}