目录
一、数组的概念
数组是一组相同类型元素的集合。数组中可以有一个或多个数据,且这些数据的类型相同。
数据可以分为一维数组和多维数组,多维数组常见的是二维数组。
二、数组的创建
int a[4];
1.一维数组
一维数组的创建:
type name[大小];
type表示数组的类型,常见的如:char、int、float等,也可以是自定义的类型。
name表示数组的名称,可以自定义。
[大小]表示数组的大小,根据需要自行定义大小,但要注意数组的大小可以超过使用的数据数,但不能少于使用的数据数。
例:
int a[5];
2.二维数组
type name[大小][大小];
type表示数组的类型,常见的如:char、int、float等,也可以是自定义的类型。
name表示数组的名称,可以自定义。
[大小][大小]表示数组的大小,第一个[大小]表示数组的行,第二个[大小]表示数组的列
例:
int a[2][3];//一个二行三列的数组
int b[3][5];//一个三行五列的数组
三、数组的类型
数组是一种自定义类型,去掉数组名剩下的就是数组的类型。
int a[5];
int b[10];
char c[5];
a数组的类型是int [5]
b数组的类型是int [10]
c 数组的类型是char [5]
四、数组的初始化
在数组创建时给定一些初始值,叫做数组的初始化。数组的初始化一般使用大括号,把初始化的值放在大括号内。
1.一维数组
//完全初始化
int a[5]={1,2,3,4,5};
//不完全初始化
int b[5]={1,2,3,4};//数组中未初始化的数默认为0.
//错误初始化
int c[5]={1,2,3,4,5,6};
//初始化的值超过数组大小会报错
2.二维数组
//不完全初始化
int a[3][5]={1,2};//数组的初始化会优先从第一行开始初始化
int b[3][5]={1,2,3,4};//如果初始化的值超过第一行的数组的大小,会先排满第一行。
//再从第二行开始初始化,以此类推。
//完全初始化
int c[3][5]={1,2,3,4,5,3,4,5,6,7,5,6,7,8,9};
//初始时可以省略行,但不能省略列
int d[][5]={1,2,2,3,3,5};//这个数列就没有定义行,但初始化的数超过数组的列,有两行,计算机默认该数
//组有两行。如果省去列就无法判断数组有几行。
//不完全定义行的初始化
int e[3][5]={{1,2},{3,4},{5,6}};//在数组的初始化中如果用{}包括部分数,表示一行数组,示例数组的第一行是1,2,0,0,0,第二行是3,4,0,0,0,第三行是5,6,0,0,0.
五、数组的使用
1.一维数组
1.1一维数组的下标
C语言中数组有自己的下标,每个数组的下标都从0开始,按照自然数的顺序排列。
int a[10]={1,2,3,4,5,6,7,8,9,10};
上面的数组中1的下标就是0,10的下标就是9。
1.2一维数组的打印
一维数组单次只能打印一个元素,如果需要打印全部数组,通常用到循环产生所以下标再打印数组。
#include<stdio.h>
int main()
{
int a[10] = { 1,2,3,4,5,6,7,8,9,10 };//创建数组
//循环打印
for (int i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
return 0;
}
1.3一维数组的输入
与数组的打印相同,数组的输入也需要访问相应的下标。
#include<stdio.h>
int main()
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};//创建数组
//循环输入
for (int i = 0; i < 10; i++)
{
scanf("%d", &a[i]);
}
//循环打印
for (int i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
return 0;
}
2.二维数组
2.1二维数组的下标
C语言规定二维数组的行和列都是从0开始的自然数
int a[3][5] = { 1,3,5,7,9,2,4,6,8,10,1,2,3,4,5 };
下标 | 0 | 1 | 2 | 3 | 4 |
0 | 1 | 3 | 5 | 7 | 9 |
1 | 2 | 4 | 6 | 8 | 10 |
2 | 1 | 2 | 3 | 4 | 5 |
上面的表格中绿色的部分表示二维数组的小标,黄色部分表示二维数组相应下标中储存的数。
2.2二维数组的打印与输入
如果只是打印单个数,只需打印相应数的下标即可:
#include<stdio.h>
int main()
{
int a[3][5] = { 1,3,5,7,9,2,4,6,8,10,1,2,3,4,5 };
printf("%d", a[2][3]);
return 0;
}
如果要访问整个数组,也是需要利用循环产生所有的下标。
#include<stdio.h>
int main()
{
int a[3][5] = { 1,3,5,7,9,2,4,6,8,10,1,2,3,4,5 };
printf("输入数组\n");
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 5; j++)
{
scanf("%d", &a[i][j]);
}
}
printf("打印数组\n");
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 5; j++)
{
printf("%d ", a[i][j]);
}
printf("\n");
}
return 0;
}
六、数组在内存中的存储
数组在内存中的存储,随着下标的增长,地址是由小到大的,且地址都是同一时间创建的,相邻且递增。多维数组是一行一行创建的,上一行末尾和下一行的开头地址也是相邻的。
#include<stdio.h>
int main()
{
printf("一维数组");
int a[5] = { 1,2,3,4,5 };
for (int i = 0; i < 5; i++)
{
printf("a[%d]的地址为%d\n",i, &a[i]);
}
int b[2][3] = { 1,2,3,4,5,6 };
printf("二维数组\n");
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
printf("b[%d][%d]的地址为%d\n", i,j, &b[i][j]);
}
}
return 0;
}
从输出结果看不管是一维数组还是二维数组,其地址都是相邻且递增的,每个地址之间相差4个字节,因为数组是用int定义的,int在内存中的字节就是4。
七、sizeof作用
sizeof是C语言的一个关键字,可以用来计算类型或变量的大小,数组大小的计算常使用sizeof。
sizeof需要的占位符是"%zd"。
注:sizeof计算的结果单位是字节。
例:
#include<stdio.h>
{
int a[5];
printf("%zd",sizeof(a));
return 0;
}
上面的代码运行结果为20,上面的代码创建了一个大小为5,类型为int的数组,一个int的字节是4,所以打印的结果是20。