七、数组
在C语言中,数组属于构造数据类型。
数组根据元素的类型不同,数组又可以分为 数值数组 、字符数组 、指针数组 、结构数组 等各种类别。
本章介绍 数值数组 和 字符数组 。
1. 一维数组的定义和引用
定义: 类型说明符 数组名 [常量表达式];
例如:int a[10]; float b[10],c[20]; char ch[20];
下标从 0 开始;
不能在 [] 中使用变量来表示元素的个数,但是可以是符号常数或常量表达式。
引用:数组名[下标]
其中下标只能为整型常量或整数表达式。
如为小数时,C编译将自动取整。。
初始化
给数组赋值的方法除了用赋值语句对数组元素逐个赋值外,还可以采用初始化赋值和动态赋值的方法。
初始化赋值形式举例: int a[10]={0,1,2,3,4,5,6,7,8,9};
C语言对数组的初始化赋值有以下几点规定:
1)可以只给部分元素赋初值。当 {} 中的值的个数少于元素个数时,只给前面部分元素赋值。
例如:int a[10]={0,1,2,3}; 表示只给前面 4个元素赋值。而后面的值自动赋 0 值。
2)只能给元素逐个赋值,不能给数组整体赋值。例如,给10个元素全部赋1值,只能写为:
int a[5]={1,1,1,1,1}; 而不能写为 int a[5]=1;
如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。例如:
int a[5]={1,2,3,4,5}; 可以写成 int a[]={1,2,3,4,5};
2. 一维数组程序举例:
main() {
int i,max,a[10];
printf("input 10 numbers:\n");
for (i=0;i<10;i++)
scanf("%d",&a[i]);
max=a[0];
for (i=1;i<10;i++)
if(a[i]>max) max=a[i];
printf("maxmum=%d\n",max);
}
例2:排序
main() {
int i,j,p,q,s,a[10];
printf("input 10 numbers:\n");
for (i=0;i<10;i++)
scanf("%d",&a[i]);
for (i=0;i<10;i++) {
p=i;q=a[i];
for(j=i+1;j<10;j++)
if(q
if(i!=p) {
s=a[i];
a[i]=a[p];
a[p]=s;
}
printf("%d",a[i]);
}
}
3. 二维数组的定义和引用
定义:类型说明符 数组名[常量表达式1][常量表达式2]
表达式1 为第一维下标的长度,
表达式2 是第二维下标的长度
例如:int a[3][4]; 说明了一个三行四列的数组,数组名为 a,其下标变量的类型为整型。
该数组的下标变量共有 3*4 个。
二维数组在概念上是二维的,但在实际的硬件存储器中却是连续编址的,也就是说存储器单元是按一维线性排列的。
如何在一维存储器中存放二维数组,可有两种方式:
一种是按行排列,即放完一行之后顺次放入第二行。
另一种是按列排列,即放完一列后再顺次放入第二列。
在C语言中,二维数组是按行排列的。即:先存放 a[0] 行,再存放 a[1] 行,最后存放 a[2] 行。
二维数组的初始化
可以按行分段赋值,也可以按行连续赋值。
例如:
int a[5][3]={ {80,75,92},{61,65,71},{59,63,80},...};
int a[5][3]={80,75,92,61,65,59,....};
对于二维数组初始化赋值的说明:
1)可以只对部分元素赋初值,未赋初值的元素自动取0值。
例如:
int a[3][3]={ {1},{2},{3}}; 是对每一行的第一列元素赋初值,未赋值的元素为0.
2)如对全部元素赋初值,则第一维的长度可以不给出:例如:
int a[3][3]={1,2,3,4,5,6,7,8,9};
可以写为
int a[][3]={1,2,3,4,5,6,7,8,9};
数组是一种构造类型的数据。
二维数组可以看作是一维数组的嵌套而构成的,设一维数组的每个元素都又是一个数组,就组成了二维数组。
当然,前提是各元素类型必须相同。
根据这样的分析,一个二维数组也可以分解成多个一维数组。
C语言允许这种分解。如二维数组 a[3][4] 可以分解为 3 个一维数组,其数组名分别为:a[0] a[1] a[2] ,对这 3 个一维数组不需要另作说明就可以使用。
必须强调的是 a[0] a[1] a[2] 不能当作下标变量使用,他们是数组名,而不是一个单纯的下标变量。
4. 字符数组:
char c[10];
由于字符型和整型通用,也可以定义为 int c[10] ,但这时每个数组元素占2个字节的内存单元。
字符数组初始化