为什么要使用数组
在编程过程中,经常遇到一个问题是:如何处理类型一致的大量数据。如存储100名学生的成绩,这需要定义一百个变量。对于这类问题可以用数组解决,数组是一组相同类型数据的有序集合。
什么是数组
- 数组是一个存储相同类型数据的有序集合。
- 每一个数据称为数组元素,这些数组元素有一个共同的名字称为数组名。
- 不同元素由其在数组中的序号(下标)来标识。
- C语言中下标从0开始计数。
- 用一个下标确定元素的数组称为以为数组,用两个下标来确定元素的数组称为二维数组。
一维数组
C语言中,变量需要先定义后使用,数组也一样,在数用数组前需要先定义。
数组定义的主要目的是确定数组的名称,数组大小和数组的类型。
一维数组的定义
一维数组的定义一般形式如下。
类型说明符 数组名 [常量表达式];
类型说明符:声明数组数据类型,同一数组所有元素的类型相同。
数组名:是一个类型标识符,命名要符合标识符命名规范。
常量表达式:必须用方括号括起来,常量表达式表示数组元素的个数。
数组定义后,C语言编译系统就在内存中为数组分配一个连续的存储空间,用来依次存放数组中各元素的值。
int a[10];//定义一个名字为a的int类型的数组,数组中有10个元素,数组下标0~9。
表示定义了一个int类型的数组,数组名为a,这个数组一共有10个元素,分别是a[0],a[1],a[2],a[3],a[4].a[5].a[6].a[7],a[8],a[9]。
每一个元素可以表示一个int类型的数据,C语言编译器会在内从中为int类型的数组a分配10*4字节的连续空间(int类型占4个字节),作为这10个元素的存储区域,数组名a表示这一片连续存储空间的开始地址。
一维数组的引用
数组定义后,就可以在程序中使用了,数组的每个元素相当于一个变量,对数组的引用就是引用数组的下标。
引用方式:
数组名 [下标]
int b[100];
b[0]=5;//第一个元素赋值为5
b[3]=8;//第4个元素赋值为8
//因为下标从0开始,所以下标+1才是第几个元素
输入十个数,存到数组中并输出
int a[10];
for(int i=0;i<10;i++)
{
scanf("%d",&a[i]);
//第一次输入的数储存到a[0]中,第二次输入的数存到a[1]中...第十次输入的数存到a[9]中
}
for(int i=0;i<10;i++)
{
//从a[0]输出一致输出到a[9]
printf("%d ",a[i]);
}
//倒序输出
for(int i=9;i>=0;i--)
{
//从a[9]输出一致输出到a[0]
printf("%d ",a[i]);
}
注意下标是从0开始,所以最大元素下标是数组长度-1。
下标可以是整型常量,算数表达式还可以是整型变量。
int a=1;
int b[100];
b[0]=5;
b[a]=4;
b[a+1]=3;
b[2+1]=2;
printf("%d %d %d %d\n",b[0],b[1],b[2],b[3]);
下标是n就代表这是第n+1个元素。
一维数组的初始化
初始化就是定义数组的时候给数组赋值,可以给全部数组赋值,也可以给部分数组赋值,为赋值的元素自动复赋值为0。
int a=1;
int b[10]={1,2,3,4,5,6,7,8,9,10};//为全部元素赋值
int c[10]={1,2,3,4,5};//只给前5个元素赋值,后5个元素自动赋值为0
排序
冒泡排序
int a[10]={9,8,6,7,2,10,16,4,1,5};
for(int i=0;i<10;i++)
{
for(int j=1;j<10;j++)
{//每一次都这个元素跟它前一个元素比较(也可以拿当前元素和后一个比较)
//a[0]元素前没有元素所以第一次要拿第二个元素也就是a[1]
//弱国拿当前元素和后一个元素比较,j的初始值为0;j<10-1;
if(a[j]<a[j-1])
{//这个元素比它前一个元素小就交换这两个元素
int e;
e=a[j];
a[j]=a[j-1];
a[j-1]=e;
}
}
//内层for循环第一次执行后最大的元素放在最后
//内层for循环第二次执行后最大的元素放在倒数第二的位置
}
选择排序
#include"stdio.h"
int main()
{
int a;
int b[10]={9,3,5,7,4,2,8,6,1,12};
//从小到大排序
for(int i=1;i<10;i++)
{
//内层for循环每次都判断0到i-1的区间有没有比b[i]大的数,如果有它和b[i]进行交换。(保证b[0]到b[i-1]这个区间没有比b[i]大的数)
for(int j=0;j<i;j++)
{
if(b[j]>b[i])//判断b[0]到b[i-1]有没有比b[i]大的数
{//如果是从大到小排序b[j]<b[i],保证b[0]到b[i-1]没有比b[i]小的数
a=b[j];
b[j]=b[i];
b[i]=a;
}
}
}
}
二维数组
一维数组只有一行,二维数组有多行。
一维数组有多个相同类型的变量,二维数组有多个相同类型的一维数组。你可以把数组看成表格或一个矩阵,一维数组只有一行多列,二维数组有多行多列。
二维数组的定义
二维数组的定义形式如下:
数据类型 数组名 [常量表达式] [常量表达式2]
常量表达式1:二维数组的第一维,表示这个数组有几行。
常量表达式2:二维数组的第二维,表示这个数组有几列。
int a[10][10];//定义一个int类型的二维数组,数组大小是10行10列,共10个元素。
二维数组中的元素分别是[0][0],a[0][1],a[0][2]…a[0][9],a[1][0],a[1][1],a[1][2]…a[9][9]。一维的下标和二维的下标都不能超过定义时的范围。a[10][10]一维的下标在0 ~ 9之间,二维的下标也在0 ~ 9之间。分别表示第一行第一个元素,第一行第二个元素,第一行第三个元素…第十行第十个元素(a[9][9])
// a[0][0] a[0][1] a[0][2] a[0][3] a[0][4]......a[0][9]
// a[1][0] a[1][1] a[1][2] a[1][3] a[1][4]......a[1][9]
// a[2][0] a[2][1] a[2][2] a[2][3] a[2][4]......a[2][9]
// .
// .
// .
// a[9][0] a[9][1] a[9][2] a[9][3] a[9][4]......a[9][9]
二维数组的引用
二位数组的引用格式:
数组名 [一维下标][二维下标]
int a[10][10];
a[0][0]=5;//第一行第一个元素赋值为5
a[1][3]=6;//第二行第4个元素赋值为6;
//与一维数组相同二维数组的下标都是从0开始,第一位和第二维下标都要加1才是第几行第几个元素。
二维数组的赋值和输出
二维数组赋值和输出使用双层for循环,外层for循环表示给第几行,内层for循环表示这行的第几个元素。
int a[10][10];
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
a[i][j]=i+j;
}
}
int a[10][10];
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
二维数组的初始化
为二维数组所有元素初始化
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
//大括号中的每个大括号是表示数组的第几维(就是第几行),
//大括号中的每个数表示为第二位的第几个数赋值(第几行第几个数赋值)
int b[3][3]={1,2,3,4,5,6,7,8,9};//
//也可以用一个大括号为所有元素赋值,大括号中的数会按照第一行第一个元素,第一行第二个元素第一行第三个元素,第二行第一个元素......第三行第三个元素的顺序赋值。
//先为第一行所有元素赋值,然后为第二行的所有元素赋值....。一直到最后一个数赋值给最后一行最后一个元素。
为二维数组部分元素初始化
int a[10][10]={{1,2,3},{4,5},{7,8,9,15}};
//分别为第一行的前三个元素赋值,第二行的前两个元素赋值,第3行的前四个元素赋值。其余元素为0。
int b[10][10]={1,2,5,4};
//因为只有4个数,所以赋值时只有第一行前4个数被赋值,其余元素为0.