关于我、重生到500年前凭借C语言改变世界科技vlog.5——数组
数组的介绍
数组简单理解就是一组相同类型元素的集合
注意:
• 数组中存放的是1个或者多个数据,但是数组元素个数不能为0
• 数组中存放的多个数据,类型是相同的
• 数组分为一维数组和多维数组,常见多维数组为二维数组
• 数组可以没有初始值,也可以没有大小
1 | int arr1; |
一维数组
一维数组的创建与初始化
一维数组其语法形式为:
1 | type arr_name[常量值]; |
type 可以是 char、float、double等等,也可以是自定义类型的数据
数组去掉其数组名剩下的就是数组的类型,比如:int arr1[10] ,arr1数组的类型是 int [10]
一维数组的完全初始化:
1 | int arr[5] = {1,2,3,4,5}; |
一维数组的不完全初始化:
1 | int arr2[6] = {1}; |
第一个元素初始化为1,其余元素初始化为0
一维数组的错误初始化:
1 | int arr3[3] = {1, 2, 3, 4}; |
超出初始化元素的个数
注意:若 [ ] 内不写个数是可以的,该数组的元素个数根据 { } 的初始化决定
一维数组的使用
数组是有下标的,假设有一组数组:
1 | int arr[10] = {1,2,3,4,5,6,7,8,9,10}; |
那它的数组和下标对应关系为
所以C语言为了便于访问数组中的元素,创建了一个操作符 [ ] ,叫下引用操作符
比如我们访问第五个元素,可以使用 arr[4] 访问
使用循环可以对数组进行打印:
1 |
|
如果我们想要知道数组中元素的个数呢?
那此时我们可以使用C语言中的一个关键字 sizeof 计算类型或变量的大小
那只要计算出一个元素所占字节的个数,数组的元素个数就能算出来
这里我们选择第⼀个元素算大小就可以
1 |
|
sizeof(arr) 为数组大小, sizeof(arr[0]) 为数组一个元素的大小,这两相除即为元素个数
一维数组的存储
要了解一维数组在内存中的存储,我们可以依次打印其各个元素的地址进行观察:
1 |
|
从代码的运行结果来看每个数组地址之间相差4个字节,由此可知一维数组在内存中是连续存放的
二维数组
二维数组的创建与初始化
数组的元素都是内置类型的
如果我们把⼀维数组做为数组的元素,这时候就是二维数组
二维数组作为数组元素的数组被称为三维数组,二维数组以上的数组统称为多维数组
二维数组其语法形式为:
1 | type arr_name[常量值1][常量值2]; |
这里的3表示数组有3行,5表示每行有5个元素
二维数组的完全初始化:
1 | int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7}; |
12345为第一行,23456为第二行,34567为第三行
1 | int arr4[3][5] = {{1,2},{3,4},{5,6}}; |
12000为第一行,34000为第二行,56000为第三行
二维数组的不完全初始化:
1 | int arr1[3][5] = {1,2}; |
第一行初始化为12000,第二、三行都为0
1 | int arr5[][5] = {1,2,3}; |
初始化时省略行,但是不能省略列
二维数组的使用
C语言规定,二维数组的行是从0开始的,列也是从0开始的,假设有一数组:
1 | int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7}; |
那它的数组和下标对应关系为
访问二维数组的单个元素我们知道了,那如何打印整个二维数组呢?
其实我们只要能够按照⼀定的规律产生所有的行和列的数字就行
1 |
|
二维数组的存储
像一维数组⼀样,我们如果想研究⼆维数组在内存中的存储方式,我们也是可以打印出数组所有元素的地址的
1 |
|
从代码运行结果来看,每个元素的地址间也是相隔4个字节,所以二维数组中的每个元素都是连续存放的,像一维数组那样一字排开存储
C99中的变长数组
在C99标准之前,C语言在创建数组的时候,数组大小的指定只能使用常量、常量表达式,或者如果我
们初始化数据的话,可以省略数组大小,这样的语法限制,让我们创建数组就不够灵活,有时候数组大了浪费空间,有时候数组小了不够用
于是C99中给了一个变长数组的新特性,允许我们使用变量指定数组大小,例如:
1 | int n = a+b; |
数组 arr 就是变长数组,它的长度取决于变量 n 的值,编译器没法事先确定,只有运行时才能知道n是多少
变长数组的根本特征,就是数组长度只有运行时才能确定,所以变长数组不能初始化,它的好处是程
序员不必在开发时,随意为数组指定⼀个估计的长度,程序可以在运行时为数组分配精确的长度
遗憾的是在VS2022上,虽然支持大部分C99的语法,没有支持C99中的变长数组