首先在进入文章之前,我们先要对数组有一个基础的认识。数组是一组相同类型元素的组合。从这个概念中可以获取两个有用的价值信息:
- 数组中存放的是1个或者多个数据,但是数组里面的元素个数不能为0。
- 数组中存放的多个数据类型必须相同。
数组分为一维数组和多维数组,在多维数组中常见的是二维数组,下面将逐一进行介绍。
一维数组
创建,初始化,数据类型
一维数组的创建语法:数据类型 数组名[常量值];例如:int arr[10]就是创建一个数据类型为整型的名称为arr的容量为10的一维数组。
数组在创建的时候通常会进行初始化,那数组如何初始化呢,分为三种
- 不完全初始化:int arr[10] = {1};第一个元素初始化为1,其余的元素默认初始化为0。
- 完全初始化:int arr[5] = {1,2,3,4,5};
- 以元素定数量:int arr[] = {1,2,3,4,5,6};这样定义确定了数组元素最大个数为6。
注意:如果初始化元素的数量大于了数组允许容纳的数量,那么程序将会报错
数组也是有类型的,数组算是一种自定义类型,去掉数组名就是数组的类型。
如:int arr[5] 的数组类型是int [5]
char arr[2] 的数组类型是char [2]
一维数组的使用
C语言中数组内的元素都是有下标的,下标从0开始。有n个数字的数组最后一个数的下标为n-1
例如这是存储在数组里面的数字:1,2,3,4,5,6,7,8,9,10
这是它们对应的下标:0,1,2,3,4,5,6,7,8,9
所以当我们要引用数组里面的某个数字时,要以下标为准。C语言提供了一个访问操作符 来访问数组里面的元素。例如,我们可以做到给数组输入几个数,打印元素在屏幕上等操作。
#include <stdio.h>
int main()
{
int i = 0;int ppp[10] = {0}; //数组的创建与初始化
for(i = 0;i < 10;i++)
{
scanf("%d",&ppp[i]); //向数组里面输入10个数
printf("%d ",ppp[i]); //将数组里面的数逐个输出在屏幕上
}
return 0;
}
⼀维数组在内存中的存储
如果要对数组有一个深入的了解,那还需要知道一维数组在内存中的存储。我们随机创建一个数组并且将里面每个元素的地址输出在屏幕上。
结果发现:随着下标的增长,地址是由小到大增长的,每一个元素之间的地址相差4(一个整型是4个字节),所以数组在内存中是连续存放的。那么我们知道这个有什么用呢?
sizeof计算数组元素个数
在遍历数组的时候,我们想知道数组的元素个数,这时候我们就可以用到sizeof,它是C语言中的一个关键字,可以计算类型或者变量,数组大小的,在前面我们知道了数组中的每一个元素占4个字节,那我们就可以把整个数组所占的字节除以单个元素所占字节来得出元素个数
#include <stido.h>
int main()
{
int arr[10] = {0};
int sz = sizeof(arr)/sizeof(arr[0]); //计算数组内元素个数
printf("%d\n", sz);
return 0;
}
二维数组
数组的元素都是内置类型的,如果我们把一维数组作为数组的元素,得到的便是二维数组,二维数组作为数组的元素便是三维数组,以此类推。
创建,初始化,数据类型
二维数组的创建方法:数据类型 数组名[行][列],例如:int arr[2][3]就是创建一个数据类型为整型的名称为arr的有两行三列的二维数组。
数组在创建的时候通常会进行初始化,和一维数组类似:
- 完全初始化:int arr[2][3] = {1,2,3, 4,5,6};
- 不完全初始化:int arr[2][3] = {1,2,3};这样使第一行有1,2两个数,第二行有3,0两个数
- 按照行列初始化:int arr[2][3] = {{1},{2,3}};这样使第一行有1,0两个数,第二行是2,3两个数
- 初始化能省略行但是不能省略列:int arr[][4] = {1,2,3};第一行的元素没满,所以行数为1,int arr[][3] = {{1,2},{3},{5,6,7}}这里只有三行,第一行有1,2,0,第二行有3,0,0,第三行有5,6,7.
注意:如果初始化元素的数量大于了数组允许容纳的数量,那么程序将会报错,或者是省略列的时候
二维数组的使用
与一维数组类似,二维数组的每个元素也有下标,不过这个下标叫做坐标可能会更加贴切
那我们如何对二维数组进行数据的输入与输出呢,不妨使用循环嵌套循环语句,遍历每一行每一列
#include <stdio.h>
int main()
{
int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
int i = 0;
//输⼊
for(i=0; i<3; i++) //产⽣⾏号
{
int j = 0;
for(j=0; j<5; j++) //产⽣列号
{
scanf("%d", &arr[i][j]); //输⼊数据
}
}
//输出
for(i=0; i<3; i++) //产⽣⾏号
{
int j = 0;
for(j=0; j<5; j++) //产⽣列号
{
printf("%d ", arr[i][j]); //输出数据
}
printf("\n");
}
return 0;
}
二维数组在内存中的存储
我们随机创建一个二维数组并且完全初始化,将它们所在的地址输出在屏幕上
结果发现:随着下标的增长,地址从小到大,每一行内部的元素是相邻的,地址之间差4个字节,就算是跨行的元素也是差4个字节,所以二维数组里面的元素也是连续存放的
注意:在C99标准中引入了一个变长数组的特性,在以前,数组元素的个数只能是常量,而C99以后元素个数可以是变量,变长数组很好的解决的创建数组不够灵活的特点,它变长数组的根本特征,就是数组长度只有运行时才能确定,所以变长数组不能初始化。