在程序设计中,数组是一种普遍使用的数据结构,是数目固定、类型相同的数据的有序集合。
数组中的每一个数据(变量)称为数组元素,数组中的所有元素都有同一种数据类型,数组在内存中占有一段连续的存储空间。
利用数组可以方便地实现成批数据的存储和处理。
C语言中的数组有来两个特点:
一是数组元素的个数必须是确定的。
二是数组元素的类型必须一致。
数组必须先定义后使用。在定义数组时。应该说明数组的类型、名称、维数和大小。
一维数组是指带一个下标的数组,定义一维数组的一般形式为:
类型说明符数组名[常量表达式]
说明:
例如:
int array1[10];
说明:定义了一个整型数组,数组名为array1,数组的长度为10。
数组在定义时应注意以下几点:
数组定义后,编译系统将在内存中自动地分配一块连续的存储空间用于存放所有数组元素。
C语言中,数组名表示内存中的一个地址,是数组中所有元素(一片连续存储空间)的首地址,存储单元的多少由数组元素的类型和数组的大小决定。
例如:
short a[15];
C语言规定,数组是一种数据元素序列,数组名代表的是数组在内存中的首地址,因此不能用数组名一次引用整个数组,只能逐个引用数组元素,一个数组元素实质上就是一个同类型的普通变量,其标识方法为数组名后跟一个下标,下标表示了元素在数组中的顺序号。
数组元素的引用方式为:
数组名[下标]
对数组元素进行引用时应注意下标的取值范围。下标的范围为:
0=<下标>=数组长度-1
例如:
int a[10];
在引用时,a[0],a[1]…a[9]是合法的。而a[10]是错误的,但系统不报告错误,这种引用不能保证得到正确的值。
C语言编译器不会检查引用数组元素时的下标是否超出范围,如果在程序执行时下标超出了范围,则会得到错误的数据,有时还会因为引用了禁止访问的内存区而导致程序被中断。
数组在引用时应注意以下几点:
所谓数组的初始化就是在定义数组的同时给数组元素赋初值。
数组初始化是在编译阶段进行的,这样可以减少运行时间,提高效率。
一般形式为:
类型说明符数组名[常量表达式] = {初值表}
说明:初值表为数组元素的初值数据,不止一个数据时,其间用逗号分开。
(1)对全部或部分数组元素赋初值
例如:
int x[8] = {1,2,3,4,5,6,7,8};
对数组中所有元素赋初值
即x[0]=1,x[1]=2,x[2]=3,x[3]=4,x[4]=5,x[5]=6,x[6]=7,x[7]=8。
再如:
int x[8]={1,2,3,4,5};
对数组中所部分元素赋初值,后系统自动补0.
即x[0]=1,x[1]=2,x[2]=3,x[3]=4,x[4]=5,x[5]=0,x[6]=0,x[7]=0。
(2)对全部数组元素赋初值时。可以不指定数组的长度,系统将根据初值数据个数确定数组长度。
例如:
int x[]={1,2,3,4,5};
即数组长度为5,x[0]=1,x[1]=2,x[2]=3,x[3]=4,x[4]=5。
(3)对全部数组元素初始化为0时,可以写成:int x[5] = {0,0,0,0,0};
或int x[5] = {0};
计算一组成绩的和。
#include
#define N 10
int main() {float score[N]; //声明数组,数组长度为10float sum = 0.0;printf("请输入%d个成绩(实型):\n", N);for (int i = 0; i < N; i++) {scanf("%f", &score[i]); //输入数据存到score数组中}for (int i = 0; i < N; i++) {printf("score[%d] = %6.2f\n", i, score[i]); //输出数据sum += score[i]; //求和} printf("sum = %.2f\n", sum);return 0;
}
结果:
二维数组是指带两个下标的数组,在逻辑上可以将二维数组看成是一张具有行和列的表格或一个矩阵,第1个下标表示行号,第2个下标表示列号。
一般形式为:
类型说明符数组名[常量表达式1][常量表达式2]
例如:
int a[2][3];
float c[2][3];
C语言规定,在计算机中二维数组的元素是按行的顺序依次存放的,即在内存中,先顺序存放二维数组第一行的元素,再顺序存放二维数组第二行的元素,以此类推。
一般形式为:
数组名[下标1][下标2]
说明:
下标的范围应满足:0=< 下标1 <常量表达式1,0=< 下标2 < 常量表达式2。
例如:
int x[2][3];
说明:定义了一个2行3列的二维数组,即
x[0][0],x[0][1],x[0][2],
x[1][0],x[1][1],x[1][2]
由于二维数组的数据在内存中是按行依次存放的,因此二维数组的初始化也是按此顺序进行赋值的。
一般形式为:
类型说明符数组名[常量表达式1][常量表达式2]={初值表}
(1)对二维数组的全部元素赋值
例如:int x[2][3]={{1,2,3},{4,5,6}};
即:
x[0][0]=1,x[0][1]=2,x[0][2]=3,
x[1][0]=4,x[1][1]=5,x[1][2]=6
在初始化格式的一对花括号内,初值表中每行数据另用一对花括号括住。
又如:int y[2][3]=(1,2,3,4,5,6);
即:
y[0][0]=1,y[0][1]=2,y[0][2]=3,
y[1][0]=4,y[1][1]=5,y[1][2]=6
此方式表示从y数组首地址开始依次存放数据。
(2)对二维数组的部分元素赋初值
例如:int x[3][3]={{1},{2,3},{4}};
即:
x[0][0]=1,x[1][0]=2,x[1][1]=3,
x[2][0]=4
其余元素为0
(3)给二维数组的全部元素赋初值,也可以不指定第一维的长度,但第二维的长度不能省略。
例如:int x[][3]={{1,2,3},{4,5,6}};
int y[][3]={1,2,3,4,5,6};
计算一个2x2的整数矩阵两条对角线上的数值之和
#include
#define N 2
int main() {int i, j;int m[N][N];int sum = 0, n = N;for (i = 0; i < N; i++) {printf("第%d行:", i);for (j = 0; j < N; j++) {scanf_s("%d", &m[i][j]); //二位数组输入数据}}for (i = 0; i < N; i++) {for (j = 0; j < N; j++) {printf("m[%d][%d]=%d ", i, j, m[i][j]); //输出数据if (j == N - 1)printf("\n");}}return 0;
}
结果: