目录
数组分为一维数组、二维数组以及多维数组。
数组的引入
C语言用同名的带下标的变量组成一个数组, 带下标的变量由数组名和用方括号括起来的下标来表示, 称为数组元素, 同一数组的各个元素只是下标不同, 通过数组名和下标可直接访问数组的每个元素。
数组是由具有固定数目的同类型的变量按一定顺序排列而构成的。
像简单变量一样, 数组元素必须先定义后引用。
要使用数组,必须在程序中先定义数组,即通知计算机 :①由哪些数据组成;②数组中有多少元素;③属于哪个数据类型。否则计算机不会把一批数据作为数据处理。
一维数组
一维数组的定义和引用
定义:当数组的元素只带一个下标时
形式:元素类型名 数组名[常量表达式]
例:int a[5];
它表示定义了一个整型数组,数组名为a,此数有5个整型元素。
关于"[]"的解释说明:
①方括号[ ]括起来的常量表达式的值为该数组含数组元素的个数, 即数组长度; 表达式可含常量和符号常量, 不允许有变量。
②下标法表示数组中的某个元素,从0开始计数。
如:a[5]数组
a[0] | a[1] | a[2] | a[3] | a[4] |
存储方式:一维数组各元素按下标的顺序 连续地分配在内存单元之中。
一维数组的初始化方式
(1)全部赋值:在定义数组时对全部数组元素赋予初值。
如:
int a[6]={0,1,2,3,4,5}
即 a[0]=0;a[1]=1;a[2]=2;...以此类推
"{}"里的所有数值统称为初始化列表
(2)部分赋值:部分数组元素赋初值,剩余部分系统自动置0。
如:
int a[6]={0,1,2,3}; //只提供了4个初值,系统自动给后两个元素赋值为0
(3)初始化成0。
如:
可以写成 int a[6]={0,0,0,0,0,0};
或 int a[6]={0}; //未赋值的部分元素自动设为0
(4)其他:在对全部数组元素赋初值时,由于数组的个数以已经确定,因此可以不指定数组长度。
注意:当初值个数多于数组元素个数时,编译出错。
如:
int a[5]={0,1,2,3,4,5};
/*error: too many initializers in main function*/
编程案例:
题目: 对10个数组依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出。
代码:
#include<stdio.h>
int main()
{
int i,a[10]={}; //定义一个变量和一个数组
for(i=0;i<10;i++) //对数组元素a[0]~a[9]进行赋值
a[i]=i;
for(i=9;i>0;i--) //逆序输出
{
printf("%d,",a[i]);
}printf("\n");
return 0;
}
运行结果:
二维数组
怎样定义二维数组?
二维数组定义的一般形式为:
类型说明符 数组名[常量表达式][常量表达式];
例如:
int a[3][4];
以上定义了一个整型的二维数组,第一维(行)有3个元素,第二维(列)有4个元素。
注意:
C语言中,二维数组中元素的排列顺序是按行存放的,即在内存中先顺序存放第1行的元素,接着再存放第2行当元素,以此类推......
二维数组的初始化
(1)分行给二维数组赋初值;
如: int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
(2)可以将所有数据写在一个花括号内,按数据组元素在内存中的排列顺序对各元素赋初值;
如: int a[3][4] ={1,2,3,4,5,6,7,8,9,10,11,12};
(3)可以对部分元素赋初值;
如: int a[3][4]={{1},{5},{9}};
或 int a[3][4]={{1},{5,6}};
或 int a[3][4]={{1},{},{9}};
其余元素自动补0
(4)如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第一维(行)的长度可以不指定,但第二维(列)的长度不能省略;
如: int a[3][4] ={1,2,3,4,5,6,7,8,9,10,11,12};
等价于 int a[][4] ={1,2,3,4,5,6,7,8,9,10,11,12};
数组会根据数据总个数和第二维(列)的长度算出第一维(行)的长度。数组一共有12个元素,没行4列,显然可以确定行数为3。
编程案例
有一个3×4的矩阵,要求编程序求出其中最大的那个元素的值,以及其所在的行号和列号。
解题思路:可以用“打擂台算法”。先让a[0][0]做“擂主”,把它的值赋给变量max,max用来存放当前已知的最大值 ,在开始时还未进行比较,把最前面的元素认为是当前值最大的。然后让下一个元素a[0][1]与max进行比较,如果a[0][1]>max,就把它赋值给max,取代max的原值。以此类推......
程序:
#include<stdio.h>
int main()
{
int max,i,j,row,cloum;
int a[3][4]={{2,9,11,3},{-8,5,-4,6},{-13,19,1,7}}; //定义一个数组并且赋初值
max=a[0][0]; //先认为a[0][0]最大
for(i=0;i<3;i++){
for(j=0;j<4;j++){
if(a[i][j]>max){ //进行比较
max=a[i][j];
row=i; //记下行号
cloum=j; //记下列号
}
}
}
printf("max=%d,row=%d,cloum=%d",max,row,cloum);
}
运行结果: