一、数组的定义
定义:
数组就是具有一定顺序关系的若干变量的集合。其中的每个变量,都被称为数组的元素。
关键点:
(1)组成数组的元素是若干个独立的变量。
(2)这些变量的数据类型必须相同。
(3)这些变量之间具有一定的顺序关系。
分类:
(1)数值数组
(2)字符数组
(3)指针数组
(4)结构体数组
注意:
数组属于构造数据类型。
二、一维数组
(1)一维数组的定义
定义:
存储类型 数据类型 数组名 [常量表达式];
解释:
存储类型---指的是auto、register、static、extern。若省略,相当于auto
数据类型---任意一种基本数据类型或构造数据类型
数组名---数组的唯一标示
常量表达式---表示数组元素的个数,也称为数组的长度
注意:
数组的数据类型实际上是数组元素的取值类型;
数组名应该符合标识符的命名规则,由字母、数字和下划线组成,但不能以数字开头;
数组名不能与其他变量名相同;
常量表达式只能是常量或常量表达式,如a[3+2];
允许在同一个类型说明中声明多个数组和多个变量。
(2)一维数组的引用
注意:
数组的引用实际上就是数组元素的引用。数组必须逐个元素的引用,不能整体引用。
形式:
数组名 [下标]
解释:
下标只能是整型常量或整形表达式,下标从0开始,范围是0~n-1,n为元素个数。
下标越界:
数组的越界操作,相当于内存访问越界,造成的后果是无法估计的。
若越界访问的内存空间是空闲的,程序可能不受影响,仍然能正确运行。
若越界访问的空间已经被占用,且写了很重要的数据,在此情况下,若程序执行了非法写操作,
则程序可能会导致异常终止或崩溃。
若越界访问的空间已经被占用,程序只是执行了读操作,则程序可能继续运行下去,但是无法得到正确的结果。
(3)一维数组的初始化
对于普通局部数组,若定义时,没有初始化,则数组中元素的值,是不确定的。
对于static修饰的数组,若定义时,没有初始化,则数组中元素的值默认为0。
对于全局数组,若定义时,没有初始化,则数组中元素的值默认为0。
数组可以在定义时进行初始化:
int a[10] = {1,2,3,4,5,6,7,8,9,10};
数组在定义时可以对其中的部分元素进行初始化:
当“{}”中的值的个数小于数组元素的个数,只对数组前面的元素进行初始化,剩余的元素被自动赋值为0。
int a[5] = {1,2}; //数组中前两个元素进行初始化,后三个自动赋值为0。
若对数组中所有的元素都进行初始化,则可以省略数组的常量表达式,编译器会根据初始化列表自动计算
数组元素的个数。
int a[] = {1,2,3,4,5,6,7,8,9,10};
一次性将数组中的所有元素全部初始化为0:
》》》int a[10] = {0};
》》》使用库函数memset
头文件:string.h
实现:
int a[10];
memset(a,0,sizeof(a));
》》》使用库函数bzero
头文件:strings.h
实现:
int a[10];
bzero(a,sizeof(a));
(4)一维数组的内存分配
在内存中,数组元素占用连续的存储空间,并根据单个元素所占的存储空间来进行内存分配。
数组名代表数组首元素地址(即数组的起始地址),相当于&a[0],是地址常量,对数组名求sizeof可以得到
数组占用内存的总空间。
数组元素个数 = sizeof(数组名)/sizeof(数据类型)