C语言中的数组

把一组类型相同的数据的集合称为数组(Array),它所包含的每一个数据叫做数组元素(Element),所包含的数据的个数称为数组长度(Length)。数组中的每个元素都有一个序号称为下标(Index),下标从0开始。

一维数组

定义格式

dataType arrayName[length];

dataType 为数据类型,arrayName 为数组名称,length 为数组长度。

数组长度可以是整数或者常量表达式,也可以是变量(变长数组)。变长数组(VLA)仍然是静态数组,一旦确定长度后就不能改变。在实际编程中,有时数组的长度不能提前确定,如果这个变化范围小,那么使用数值常量定义一个足够大的数组就可以,如果这个变化范围大,就可能会浪费空间,这时就可以使用变长数组。

访问数组元素的格式为

arrayName[index]

index 为数组下标。注意 index 的值必须大于等于零,并且小于数组长度,否则会发生数组越界。

 

二维数组

定义格式:

dataType arrayName[length1][length2];

dataType 为数据类型,arrayName 为数组名,length1 为第一维下标的长度,length2 为第二维下标的长度。

二维数组在概念上是二维的,但在内存中是连续存放的。

在C语言中,二维数组是按行排列的。

二维数组可以看作由多个长度相同的一维数组构成的。且这些一维数组不需另作说明即可直接拿来使用。

 

数组的初始化

数组元素的值由{ }包围,各个值之间以 , 分隔。

只能给元素逐个赋值,不能给数组整体赋值。

如果对一维数组全部元素赋值,那么在定义数组时可以不给出数组长度。如果对二维数组全部元素赋值,那么第一维的长度可以不给出,但第二维数组的长度一定不能省略。

可以先定义数组再给数组赋值,也可以在定义数组的同时赋值。

二维数组的初始化可以按行分段赋值,也可按行连续赋值。

按行分段赋值: int a[3][2]={ {80, 75}, {61, 65}, {59, 63} };

按行连续赋值:int a[5][3]={80, 75, 61, 65, 59, 63};

可以只对部分元素赋值,未赋值的元素自动取“零”值:

        对于short、int、long,就是整数 0;

        对于char,就是字符 '\0';

        对于float、double,就是小数 0.0。

可以通过下面的形式将数组的所有元素初始化为 0:

int nums[10] = {0};

char str[10] = {0};

float scores[10] = {0.0};

一般会使用循环结构将数据放入数组中(也就是为数组元素逐个赋值),然后再使用循环结构输出(也就是依次读取数组元素的值),二维数组使用嵌套循环读写数据。

scanf() 读取数据时,a[i] 表示一个具体的数组元素,所以我们要在前边加 &。

数组内存是连续的

数组在内存中占用一段连续的空间,数组元素之间是相互挨着的,彼此之间没有一点缝隙。连续的内存为指针操作(通过指针来访问数组元素)和内存处理(整块内存的复制、写入等)提供了便利,这使得数组可以作为缓存(临时存储数据的一块内存)使用。

一般情况下,数组名会转换为数组的地址,需要使用地址的地方,直接使用数组名即可。

越界和溢出

在C语言中,数组一旦被定义后,占用的内存空间就是固定的,不能在任何位置插入元素和删除元素,我们将这样的数组称为静态数组(Static Array)。

C语言数组不会自动扩容,当下标小于零或大于等于数组长度时,就发生了越界(Out Of Bounds),访问到数组以外的内存。如果下标小于零就会发生下限越界(Off Normal Lower);如果下标大于等于数组长度就会发生上限越界(Off Normal Upper)。

C语言为了提高效率,并不会对越界行为进行检查,即使越界了也能够正常编译,只有在运行期间才可能会发生问题。越界访问的数组元素可能是其他变量的值、附加数据、地址等等,没有实际的含义。

当发生数组越界时,如果我们对该内存有访问权限,程序将正常运行,但会出现不可控的结果;如果没有访问权限,程序将会崩溃。

当赋予数组的元素个数超过数组长度时,就会发生溢出(Overflow)。一般情况下数组溢出不会有什么问题,顶多是丢弃多余的元素。但对于字符数组,有时会产生不可控的情况,字符串的长度大于数组长度,数组只能容纳字符串的前几个字符,即使编译器在最后添加了 '\0',它也保存不到数组里面,所以 printf() 扫描数组时不会遇到结束符 '\0',只能继续向后扫描。而后面内存中的数据我们不知道是什么,字符能否识别,何时遇到 '\0',这些都是不确定的。当字符无法识别时,就会出现乱码,显示奇怪的字符。

你可能感兴趣的:(C语言,C语言)