引言:在生活中 同种类型的东西有很多 在C语言中 也有很多数据类型 整形 浮点型 字符型等等 那我们如何能够一次存储多个相同类型的数据呢? 让我们一起学习今天的知识--数组
1.数组的概念
数组是一组存放相同类型元素的集合 它可以存放一个或多个相同类型的数据 数组分为一维数组和多维数组 我们最常用的就是一维数组和二维数组
2.一维数组的创建和初始化
2.1数组创建
上图为一维数组创建的基本语法 type意思是类型 代表我们要存放元素的类型 arr_name 是由我们定义的数组的名字 常量值代表数组中元素的个数
上图为创建一个数组的例子 这就是一个名为math的数组 数组元素个数为20 每个元素类型为整形 名字math的理解就比如我们创建一个整形变量a 那我们就要写int a 那a就是这个整形变量的名字 数组类比一下就好理解了
2.2数组的初始化
我们定义一个变量时 给它赋一个初始值 就代表初始化 数组也是一样 给数组内的元素赋值就是给数组初始化 数组的初始化一般用大括号
第一个完全初始化 大括号里的值从左到右代表第一到第五个元素的值 还有不完全初始化 那么剩下没有赋值的元素会默认为0 数组有几个元素大括号里就给几个值 用逗号分开
2.3数组的类型
数组也是有类型的 当我们创建一个整形变量时 比如 int a 去掉名字剩下的就是变量的类型 去掉a剩下int 就是a的类型 所以a是一个整形变量 数组也是一样
去掉名字 剩下的就是数组的类型 所以
arr1的类型为 int [10]
arr2的类型为 int [12]
ch的类型为char [5]
3.一维数组的使用
3.1数组下标
C语言规定数组是有下标的 下标从0开始 所以第一个元素的数组下标为0 第二个元素的数组下标为1 以此类推
“[]” 这个符号在C语言中叫做下标引用操作符 这个操作符能用来访问数组中的元素 如果我们想要访问下标为7的元素 那么就可以使用arr[7]
如上图 arr[7] 就代表数组中的第八个元素8 那么程序就会打印8 arr[3]就代表数组中的第4个元素 程序就会打印4 这就是下标引用操作符的用法 我们也可以用来对数组元素进行赋值 加减等操作
3.2数组的打印
如果我们想要访问整个数组的元素 那我们就要使用循环来产生所有的下标 这样就可以一个一个访问数组中的所有元素了
如上图 我们定义了一个整形数组 再使用for循环来打印数组中的每个元素 以i作为下标 通过for循环循环10次 这样就能打印数组中的每个元素
3.3数组的输入
当我们想要让使用程序的用户决定数组的内容时 我们就可以用下面的代码来实现让用户输入数组的内容
代码如上图 跟数组的打印大差不差
4.sizeof计算数组元素个数
在C语言中 有一个关键字叫sizeof 用来计算类型或者变量的大小 单位是字节
用法如上图 sizeof() sizeof计算的就是放在括号里的数据的大小 里面放数组名 就能计算整个数组的大小 这里输出的结果是40 因为arr是一个整形数组 里面有10个元素 一个整形在内存中占4个字节 10个整形元素在内存中就占40个字节 所以这个数组的大小为40个字节
那么我们知道 数组中的元素都是相同类型的 所以我们用sizeof计算出整个数组的大小 再计算出一个元素的大小 二者相除就能知道总共有多少元素了
如上图 arr[0] 就代表第一个元素 我们用一个整形变量sz来接受计算结果也就是数组的元素个数 所以这个打印的结果就是10
所以当我们以后不确定数组的元素个数时 就可以用这种方法来求得数组元素的个数
5.二维数组
我们可以把一个一维数组看做一个元素 那么这个元素便也可以被数组存放 把一维数组作为元素存放 那么这个存放一维数组的数组就是二维数组
我们在之前说过 去掉名字剩下的就是类型 就如同创建一个变量一样 我们用一维数组存放相同类型的变量 也可以用二维数组来存放相同类型的一维数组 如上图 一维数组的类型为 int [5] 所以我们可以创建一个二维数组来存放相同类型的一维数组
5.1二维数组的创建
如上图 3表示数组有三行 5代表数组有5列 也就是每一行有5个元素 int 代表每个元素的类型为整形 arr就是二维数组的名字
下面我们从另一个角度来理解二维数组
二维数组是把一维数组作为元素存放 那么其实二维数组也是一个特别的一维数组 那么我们就把它当一维数组看待 那么arr就可以写成
int [5] arr[3] 这个一维数组中元素的类型是int [5] 就是存放5个整形变量的一维数组 并且arr中存放了三个这样的数组作为元素 这就是二维数组
上面我们把数组具象为三行五列 结合上述理解 每一行就是二维数组的一个元素 这个元素是一个一维数组存放5个元素 所以有5列 三个这样的一维数组便构成了一个二维数组
5.2二维数组的初始化
5.2.1不完全初始化
不完全初始化如上图 二维数组的初始化顺序是由上至下 由左至右的
5.2.2完全初始化
完全初始化如上图
5.2.3按照行初始化
按照之前的解释 二维数组就是存放一维数组的数组 每一行就是二维数组的一个元素 也就是一个一维数组 所以我们按照行初始化时相当于对每行的一个一维数组初始化 所以在大括号里再使用大括号 剩下的没初始化的元素便按照规则默认为0
5.2.4 初始化时省略行 但是不能省略列
在给一维数组初始化时可以不在[]中填入一个常量 比如int arr[]={1,2,3} 这样一来 我们初始化几个值 编译器就会默认数组中有几个元素
为什么二维数组初始化可以省略行但不能省略列呢?
如果我们省略列的话那编译器就不知道一行有几个元素 那么编译器就永远无法对第二行进行初始化了
从另一个角度讲
按照我们对之前的理解 二维数组也可以说是一个特殊的一维数组 以arr5为例 我们可以把arr5改写为
int[5] arr[] 代表arr中元素的类型是一个存放5个整形元素的一维数组 那么如果我们省略列的话 那我们便不知道要存放元素的类型 那边无法初始化arr5这个“一维数组”了。
5.3二维数组的使用
5.3.1二维数组的下标
二维数组下标的使用案例如上图
我们之前说过 二维数组的每一行是一个元素 即一个一维数组 那么arr[0] 就是第一行 arr[0]就相当于第一个元素也就是第一个数组的数组名 所以arr[0][1]就相当于第一个数组的第二个元素 从这个角度看就跟使用一维数组没有区别了
5.3.2二维数组的输入和输出
上图为二维数组的输入 我们使用for循环嵌套来解决二维数组的问题 i代表行 最外层的for循环代表打印每一行 里面嵌套的for循环代表打印一行的每一个元素 我们用j来代表列 这样就能遍历二维数组的每一个元素
二维数组的输入也用一样的方法
6.c99中的变长数组
c99是C语言使用的标准规则 在c99标准之前 数组的大小只能用常量或者常量表达式来指定也就是[]里的值必须是常量
有这样的限制存在使数组的使用不够灵活 一旦数组创建 那么数组的大小就定死了
在c99规则出版之后 就有了变长数组的概念 数组的大小不再确定 可以交给用户决定
如上图 arr中数组的元素个数是一个变量n 编译器无法事先确定 用户可以随意修改arr的大小 这样一来 数组的大小只有在运行的时候才能确定 所以变长数组不能初始化
注:在vs中 变长数组是不支持的 但是并不代表变长数组不能使用
完