数组的基本概念
本小节知识点:
1.数组的基本概念
数组,从字面上看,就是一组数据的意思,没错,数组就是用来存储一组数据的
在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。
- 注意:只能存放一种类型的数据
数组的几个名词
- 数组:一组具有相同数据类型的数据的有序的集合
- 数组元素:构成数组的数据。数组中的每一个数组元素具有相同的名称,不同的下标,可以作 为单个变量使用,所以也称为下标变量。
- 数组的下标:是数组元素的位置的一个索引或指示。(从0开始)
- 数组的维数:数组元素下标的个数。根据数组的维数可以将数组分为一维、二维、三维、多维 数组。
数组的应用场景
- 一个int类型的变量能保存一个人的年龄,如果想保存整个班的年龄呢?
- 第一种方法是定义很多个int类型的变量来存储
- 第二种方法是只需要定义一个int类型的数组来存储
- 一个int类型的变量能保存一个人的年龄,如果想保存整个班的年龄呢?
2.数组的分类
按存储的内容分类
- 数值数组:用来存储数值得
- 字符数组:用来存储字符 ‘a’
- 指针数组:用来存放指针(地址)的
- 结构数组:用来存放一个结构体类型的数据
- … …
按维度分类
- 一维数组
- 二维数组
+ 多维数组
数组的定义、初始化、使用
本小节知识点:
1.定义数组
- 元素类型 数组名[元素个数];
- 示例:
~~ “`
~~ int ages[10];
~~ “`
2.初始化数组
- 一般会在数组定义的同时进行初始化
- 其中在{ }中的各数据值即为各元素的初值,各值之间用逗号间隔
~~ int ages[3] = {4, 6, 9};
- 指定数组的元素个数,对数组进行部分显式初始化
- 定义的同时对数组进行初始化,没有显式初始化的元素,那么系统会自动将其初始化为0,也有可能为垃圾数据
~~ int nums[10] = {1,2};
+ 定义数组的时候,数组元素的个数不能使用变量,如果使用变量,不初始化的情况下是随机数,如果初始化会直接报错
- 不指定元素个数,定义的同时初始化,它是根据大括号中的元素的个数来确定数组的元素 个数
- 如果定义数组时没有进行初始化,不能省略元素个数
~~ int nums[] = {1,2,3,5,6};
- 指定元素个数,同时给指定元素进行初始化
“`
~~ int nums[5] = {[4] = 3,[1] = 2};
- 先定义,后初始化
```
~~ int nums[3];
~~ nums[0] = 1;
~~ nums[1] = 2;
~~ nums[2] = 3;
- 只有在定义的同事进行初始化,如果先定义就不能再进行整体赋值。
- 没有初始化会怎样?
- 如果定义数组后,没有初始化,数
组中是有值的,是随机的垃圾数,所以如
果想要正确使用数组应该要进行初始化。
- 如果定义数组后,没有初始化,数
~~ int nums[5];
~~ printf("%d\n", nums[0]);
~~ printf("%d\n", nums[1]);
~~ printf("%d\n", nums[2]);
~~ printf("%d\n", nums[3]);
~~ printf("%d\n", nums[4]);
~~ 输出结果:
~~ 0
~~ 0
~~ 1606416312
~~ 0
~~ 1606416414
```
>+ 注意:对于数组来说,一旦有元素被初始 化,其他元素都被赋值0
## 3.数组的使用
- 通过下标(索引)访问:
~~ ages[0]=10;
~~ int a = ages[2];
~~ printf(“a = %d”, a);
# 数组注意事项
## 1.数组注意事项
- 在定义数组的时候\[]里面只能写整型常量或者是返回整型常量的表达式,不能写变量
~~ int ages4[‘A’] = {19, 22, 33};
~~ printf(“ages4[0] = %d\n”, ages4[0]);
~~
~~ int ages5[5 + 5] = {19, 22, 33};
~~ printf(“ages5[0] = %d\n”, ages5[0]);
~~
~~ int ages5[‘A’ + 5] = {19, 22, 33};
~~ printf(“ages5[0] = %d\n”, ages5[0]);
- 错误写法
~~ // 没有指定元素个数,错误
~~ int a[];
~~
~~ []中不能放变量
~~ int number = 10;
~~ int ages7[number]; // 不报错, 但是没有初始化, 里面是随机值
~~ printf(“%d\n”, ages7[4]);
~~
~~
~~ int number = 10;
~~ int ages7[number] = {19, 22, 33} // 直接报错
~~ int ages8[5];
~~
~~ // 只能在定义数组的时候进行一次性(全部赋值)的初始化
~~ int ages10[5];
~~ ages10 = {19, 22, 33};
~~
~~ // 一个长度为n的数组,最大下标为n-1, 下标范围:0~n-1
~~ int ages11[4] = {19, 22, 33}
~~ ages[8]; // 数组角标越界
---
# 数组遍历
## 本小节知识点:
## 1.数组的遍历
- 数组的遍历:遍历的意思就是有序地查看数组的每一个元素
- 示例
~~ int ages[4] = {19, 22, 33, 13};
~~ for (int i = 0; i < 4; i++) {
~~ printf(“ages[%d] = %d\n”, i, ages[i]);
~~ }
~~
“`
2.数组长度计算方法
因为数组在内存中占用的字节数取决于其存储的数据类型和数据的个数
数组在内存中占用的总字节数:sizeof(数组名);数组所占用存储空间 = 一个元素所占用存储空间 * 元素个数(数组长度)
- 所以计算数组长度可以使用如下方法
数组的长度 = 数组占用的总字节数 / 数组元素占用的字节数
int ages[4] = {19, 22, 33, 13};
int length = sizeof(ages)/sizeof(int);
printf("length = %d", length);
输出结果: 4
3.练习
- 正序输出(遍历)数组
~~ int ages[4] = {19, 22, 33, 13};
~~ for (int i = 0; i < 4; i++) {
~~ printf("ages[%d] = %d\n", i, ages[i]);
~~ }
```
- 逆序输出(遍历)数组
```
~~ int ages[4] = {19, 22, 33, 13};
~~ for (int i = 3; i >=0; i--) {
~~ printf("ages[%d] = %d\n", i, ages[i]);
~~ }