1.数组的概念
我们知道C语言中有许多数据类型,对于单个类型的存储我们可以定义一个变量,那么多个数据类型的存储用什么呢?——数组——⼀组相同类型元素的集合
根据数组的定义有以下需要注意的点:
- 数组中存放的是1个或者多个数据,但是数组元素个数不能为0
- 数组中存放的多个数据,类型是相同的
数组可以分为一维数组和多维数组(二位数组最为常见)
2.一维数组的创建和初始化
2.1数组的创建
⼀维数组创建的基本语法如下: type arr_name[常量值];
type 指的是数组元素的类型
arr_name 指数组名
[] 用于指定数组的大小
2.2 数组的初始化
有时候,数组在创建的时候,我们需要给定⼀些初始值,这种就称为初始化的
初始化分为完全初始化、不完全初始化、错误初始化
//完全初始化
int arr[5] = {1,2,3,4,5};
//不完全初始化
int arr2[6] = {1};//第⼀个元素初始化为1,剩余的元素默认初始化为0
//错误的初始化 - 初始化项太多
int arr3[3] = {1, 2, 3, 4};
在初始时可以不指定有多少个元素,C语言会根据我们初始化的内容自动分配空间
2.3 数组的类型
在创建变量的时候我们知道去掉变量的名称就是变量的类型,数组也是同理。
例如:int arr[10]={0}; 这个arr数组的类型就是int [10]
3. ⼀维数组的使用
学习了⼀维数组的基本语法,⼀维数组可以存放数据,存放数据的⽬的是对数据的操作,那我们如何 使⽤⼀维数组呢?
3.1 数组下标
C语⾔规定数组是有下标的,下标是从0开始的,假设数组有n个元素,最后⼀个元素的下标是n-1,下 标就相当于数组元素的编号
有了数组的下表我们需要一个下表引用操作符——[]对数组的元素进行访问。有了下标访问操作符,我们就可以轻松的访问到数组的元素了,⽐如我们访问下标为7的元素,我们就 可以使⽤ arr[7] ,想要访问下标是3的元素,就可以使⽤ arr[3]
3.2 数组元素的打印与输入
我们可以借助for循环对数组进行打印与输入操作
#include<stdio.h>
int main()
{
int i = 0;
int arr[10] = { 0 };
for (i = 0; i < 10; i++)
{
scanf("%d", &arr[i]);
}
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
4. ⼀维数组在内存中的存储
对于数组在内存中的存储,我们需要知道它元素的地址——%p可以用来打印地址(或者调试的时候也可以看到)
从输出的结果我们分析,数组随着下标的增⻓,地址是由⼩到⼤变化的,并且我们发现每两个相邻的 元素之间相差4(因为⼀个整型是4个字节)。所以我们得出结论:数组在内存中是连续存放的。
5. 数组元素个数的计算
又是我们会用到数组有几个元素,那么我们怎么计算数组元素的个数呢
对于整形数组可以用 sizeof——sizeof 中C语⾔是⼀个关键字,是可以计算类型或者变量⼤⼩的,其实 sizeof 也可以计算数组的 ⼤⼩。
6. ⼆维数组的创建
6.1 ⼆维数组的概念
数组的元素都是内置类型的,如果我们把⼀维数组做为数组的元 素,这时候就是⼆维数组,⼆维数组作为数组元素的数组被称为三维数组,⼆维数组以上的数组统称 为多维数组。
6.2 ⼆维数组的创建
int arr[3][5];
• 3表⽰数组有3⾏
• 5表⽰每⼀⾏有5个元素
• int 表⽰数组元素的类型
• arr 是数组名
7. ⼆维数组的初始化
二维数组的初始化基本同一维数组
7.1 不完全初始化
int arr1[3][5] = {1,2};
int arr2[3][5] = {0};
7.2 完全初始化
int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
7.3 按照⾏初始化
int arr4[3][5] = {{1,2},{3,4},{5,6}};
7.4 初始化时省略行,但是不能省略列
int arr5[][5] = {1,2,3};
int arr6[][5] = {1,2,3,4,5,6,7};
int arr7[][5] = {{1,2}, {3,4}, {5,6}};
8. ⼆维数组的使用
8.1 ⼆维数组的下标
其实⼆维数组访问也是使⽤下标的形式的,⼆维数组是有⾏和列的,只要锁定了⾏和列就能唯⼀锁定 数组中的⼀个元素。
⼆维数组的⾏也是从0开始的,列也是从0开始的
8.2 ⼆维数组的输入和输出
二维数组是一维数组的一维数组,所以我们对二位数组的输入和输出可以借助for循环的嵌套
9. ⼆维数组在内存中的存储
我们以同样的方式去打印数组每个元素的地址
可以看到二位数组的存放也是连续的
事实上多维数组的存放都是连续的
10.数组传参
数组名除了在sizeof()中和&arrx形式的时候表示的都是首元素的地址,也很好理解,毕竟如果在函数里面调用数组不能在创建一个数组,而是以首元素地址的形式直接将整个数组摸出来。
11. C99中的变长数组
在C99标准之前,C语⾔在创建数组的时候,数组⼤⼩的指定只能使⽤常量、常量表达式,或者如果我 们初始化数据的话,可以省略数组⼤⼩。这样的语法限制,让我们创建数组就不够灵活,有时候数组⼤了浪费空间,有时候数组⼜⼩了不够⽤ 的。
C99中给⼀个变⻓数组(variable-length array,简称 VLA)的新特性,允许我们可以使⽤变量指定 数组⼤⼩。
上⾯⽰例中,数组 arr 就是变⻓数组,因为它的⻓度取决于变量 n 的值,编译器没法事先确定,只 有运⾏时才能知道 n 是多少。所以变长数组的大小只有在运行之后才可以知道
特别说明:vs2022使用的编译器是msvc并不支持变长数组,但是可以在安装的时候选择加入clang来使用变长数组