嵌入式之路,贵在日常点滴
---阿杰在线送代码
参考笔友老朱
目录
一、数组的基本概念
- 数组,从字面上看,就是一组数据的意思,没错,数组就是用来存储一组数据的
- 在C语言中,数组属于构造数据类型
- 数组的几个名词
- 数组:一组相同数据类型数据的有序的集合
- 数组元素: 构成数组的每一个数据。
- 数组的下标: 数组元素位置的索引(从0开始)
- 数组的应用场景
- 一个int类型的变量能保存一个人的年龄,如果想保存整个班的年龄呢?
- 第一种方法是定义很多个int类型的变量来存储
- 第二种方法是只需要定义一个int类型的数组来存储
- 一个int类型的变量能保存一个人的年龄,如果想保存整个班的年龄呢?
二、定义数组
- 元素类型 数组名[元素个数];
// int 元素类型
// ages 数组名称
// [10] 元素个数
int ages[10];
三、初始化数组
- 定义的同时初始化
- 指定元素个数,完全初始化
- 其中在{ }中的各数据值即为各元素的初值,各值之间用逗号间隔
int ages[3] = {4, 6, 9};
- 不指定元素个数,完全初始化
- 根据大括号中的元素的个数来确定数组的元素个数
int nums[] = {1,2,3,5,6};
- 指定元素个数,部分初始化
- 没有显式初始化的元素,那么系统会自动将其初始化为0
int nums[10] = {1,2};
int nums[5] = {[4] = 3,[1] = 2};
- 不指定元素个数,部分初始化
int nums[] = {[4] = 3};
- 先定义后初始化
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开始, 到元素个数-1结束
- 使用数组时不要随意使用未初始化的元素, 有可能是一个随机值
- 采用部分初始化,初始化第一个元素,其他元素的值默认为0
- 对于数组来说, 只能在定义的同时初始化多个值, 不能先定义再初始化多个值
int ages[3];
ages = {4, 6, 9}; // 报错,逐个赋值
注意:
数组只有在定义的时候[ ]
表示个数,其他时候都是下标。
数组的下标是从0开始
,即数组的第一个元素是a[0]
。
数组的最后一个元素是a[i-1]
四、数组的使用
- 通过下标(索引)访问:
// 找到下标为0的元素, 赋值为10
ages[0]=10;
// 取出下标为2的元素保存的值
int a = ages[2];
printf("a = %d", a);
五、数组的遍历
- 数组的遍历:遍历的意思就是有序地查看数组的每一个元素
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};
int length = sizeof(ages)/sizeof(int);
printf("length = %d", length);
输出结果: 4
七、数组内部存储细节
- 存储方式:
- 1)内存寻址从大到小, 从高地址开辟一块连续没有被使用的内存给数组
- 2)从分配的连续存储空间中, 地址小的位置开始给每个元素分配空间
- 3)从每个元素分配的存储空间中, 地址最大的位置开始存储数据
- 4)用数组名指向整个存储空间最小的地址
示例
#include <stdio.h>
int main()
{
int num = 9;
char cs[] = {'l','n','j'};
printf("cs = %p\n", &cs); // cs = 0060FEA9
printf("cs[0] = %p\n", &cs[0]); // cs[0] = 0060FEA9
printf("cs[1] = %p\n", &cs[1]); // cs[1] = 0060FEAA
printf("cs[2] = %p\n", &cs[2]); // cs[2] = 0060FEAB
int nums[] = {2, 6};
printf("nums = %p\n", &nums); // nums =