数组的概念
数组是一组相同类型元素的集合
一个数组可以存放个或者多个数据,但不能为空集,这样就没有意义了
数组存放的多个数据类型相同
一维数组
创建
基本语法形式
类型 数组名[常量值//数组的大小];
//类型可以是内置类型,也可以是自定义类型
例如
//一个班30个人的成绩
float score[30];
初始化
//完全初始化
int age[5] = {10,20,30,40,50};
//不完全初始化
double weight[10] = {50,40};
//初始化第一个元素50,第二个元素40,剩下8个元素默认初始化为0
//错误的初始化方式
int num[3] = {1,2,3,4};//元素数目多了
如果初始化了,就可以省略数组的大小,此时编译器会根据数组初始化内容来确认数组的真实大小例如
int cnt[3] = {1,2,3};
int cnt[ ] ={1,2,3};
//这是两个相同的数组
类型
数组的类型就是去掉数组名留下的部分,这里要忘了“[ ]”
使用
数组可以用来储存数据,储存数据目的是操作数据
数组的下标
我们看个例子
int cnt[ 5] = {1,2,3,4,5};
这里我们可以看到数组元素与对应坐标相差1,这里就可以把数组类比为矩阵或者是向量了,数组的下标就是向量的坐标(这里忽略负值),一维数组即为一维向量,大家这样类比理解就好,如果没学过线性代数的朋友,推荐大家《线性代数及其应用》这本书,在B站搜线代的本质,两个搭配很舒服,线代对于工科是很重要的。
我们回过头来,C语言中数组的访问提供了一个操作符[ ],叫做下标引用操作符
比如我们想要访问下标为3的元素,就可以使用 cnt[3]
这下可以清晰看到数组元素与对应下标相差1
数组元素的打印
要牢记数组元素与对应下标相差1
数组的输入
一维数组在内存中的储存
我们现在打印数组的地址,需要用到&符 %p是地址的占位符
随着数组下标的增长,地址由小变大,每个相邻元素相差四(整型是四个字节)
所以得出结论:
sizeof计算数组元素个数
sizeof用于计算变量或者类型的长度,单位是字节
第一个打印的是整个数组的大小,第二个打印的是数组元素的个数
二维数组
二维数组是把一维数组作为元素的数组,三维数组是把二维数组作为元素的数组
这里就可以更好的利用矩阵和向量来理解了
图片源自网络
2维面,3维体
创建
基本语法形式:
类型 数组名[值常量1] [常量值2];
// 行 列
// int num[3] [4];
//三行四列(doge_),数组有三行,一行有四个元素
//num 是数组名
初始化
不完全初始化
int cnt1[3] [4] = {1,2}; //3*4=12个元素,依次初始化每一行的元素,不够时剩下的初始化为0
int cnt2[3] [4] = {0};//第一行第一列初始化为0,相当于全部都是0
完全初始化
int cnt[3] [4] = {1,2,3,4, 5,6,7,8, 3,4,5,6};
我们初始化时,可以按行初始化,因为二维数组的元素是一维数组
int num[3] [4] = {{1,2},{ 3,4},{ 5,6}};
初始化时可以行省略,但不能列省略,为什么?先要放满一行,如果列省略的话一行放几个元素呢?
int arr1[ ] [4] = {1,2,3};
int arr2[ ] [4] = {1,2,3,4,5,6};
使用
二维数组的输入和输出
二维数组在内存中的储存
行内部每一个元素相邻的,地之间相差4字节,跨行处的两个元素之间也相差4字节,所以二维数组每个元素连续存放