LV005-数组简介
一、什么是数组
数组是 构造数据类型 之一,是具有一定顺序关系的若干个 变量 的 集合,组成数组的各个变量称为数组的 元素,数组中各元素的 数据类型要求相同,用 数组名 和 下标 确定。数组可以是一维的,也可以是多维的。它的核心特点是:
- 内存连续:数组中的元素在内存中紧密排列。
- 固定长度:数组一旦声明,大小不可改变。
- 索引访问:通过下标(从 0 开始)定位元素。
例如,一个存储 5 个整数的数组就像 5 个连续的“格子”,每个格子可以通过编号(0 到 4)来访问。
Tips:总之,数组是一组有序的、类型相同的数据集合。
二、一维数组
1. 什么是一维数组
1.1 基本概念
一维数组是指 只有一个下标 的数组。它在计算机的内存中是 连续存储 的。
1.2 怎么声明?
storage_type data_type array_name[ array_size ];| storage_type | 存储类型(可以说明也可以不说明) |
| data_type | 任意有效的 C 数据类型(必须说明) |
| array_name | 数组名称(必须说明) |
| array_size | 数组长度(有些情况可以省略) |
1.3 声明示例
float m[12]; /* 定义一个长度为 12 的浮点型数组 */
char ch[9]; /* 定义一个长度为 9 的字符型数组 */
int a[1]; /* 定义一个长度为 9 的整型数组 */
int b[] = {0, 1, 2}; /* 定义了一个长度为 3,且进行了初始化的整形数组 */【注意】
(1)数组必须 先声明 才能进行使用和赋值。
(2) C 语言 对数组 不作越界检查,使用时要注意。
(3)用变量定义数组维数时,该变量必须提前告知。例如 int i = 6; int a [i];
(4) sizeof(array_name) 可以获取整个一维数组所占据的字节数(等于元素个数 x 元素类型所占字节数)。
2. 元素访问
2.1 怎么访问数组元素?
array_name[index] /* 数组名 [元素索引(也可以说是下标)] 索引从 0 开始 */例如:
int a[10];
printf(“%d”, a); /* (错误) 这种访问方式是错误的 */
for(j=0;j<10;j++)
{
printf(“%d\t”, a[j]); /* (正确) 这种情况才是正确的访问方式 */
}【注意】
(1)数组必须定义之后才能够访问。
(2)数组的元素只能逐个访问,不能一次性访问整个数组。
(3)下标可以是整型表达式或者常量。
2.2 遍历一维数组
int a[10];
int i, n;
n = sizeof(a) / sizeof(int);
/* 通过for循环来逐个访问 */
for(j = 0; j < n; j++)
printf(“%d\t”, a[j]); /* 逐个打印数组元素 */3. 元素初始化
int a[6] = {0, 1, 2, 3, 4, 5}; /* 在声明数组时直接进行初始化 */
int b[] = {0, 1, 2}; /* 定义了一个长度为 3,且进行了初始化的整形数组 */【注意】
(1)数组不初始化,其元素值为随机数
(2)对 static 数组元素不赋初值,系统会自动赋以 0 值
(3)只给部分数组元素赋初值,剩余元素自动赋值为 0 。
【说明】
| 数组声明形式 | 等价写法 |
| static int a [3]; | static int a [3]; a [0] = 0; a [1] = 0; a [2] = 0; |
| int a [3] = {1, 2}; | int a [3]; a [0] = 1; a [1] = 2; a [2] = 0; |
| int a [] = {1, 2, 3} | int a [3]; a [0] = 1; a [1] = 2; a [2] = 3; /* 编译系统根据初值个数确定数组维数 */ |
4. 存储空间
数组是一个整体,它的 内存是连续 的,相邻元素地址相差 data_type 所占字节长度。
例如:
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a[3] = {1, 2, 3};
int i;
for(i = 0; i < 3; i++)
{
printf("&a[%d] = %p, a[%d] = %d\n",i, &a[i], i,a[i]);
}
return 0;
}a [3] 在内存中的结构如下图所示, a [3] 数组为 int 类型,在 64 位平台下占 4 个字节,所以相邻元素之间地址相差 4 。
5. 数组名
一维数组的数组名代表了该数组的起始地址,可以通过该数名推出各个元素的地址,并通过指针(后边说,先提一下)进行访问。
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a[3] = {1, 2, 3};
int i;
printf("a = %p\n",a);
for(i = 0; i < 3; i++)
{
printf("a + %d = %p, &a[%d] = %p, a[%d] = %d\n",i, a + i, i, &a[i], i,a[i]);
}
return 0;
}【注意】数组名 不可以进行自加自减 运算。
三、获取数组元素个数
怎么获取数组的大小?有两种方式。
1. 用元素类型
我们定义一个数组的时候是知道数组中元素的类型的,比如int a[2];,这个时候我们可以使用下面的方式获取数组元素个数:
array_len = sizeof(数组名) / sizeof(数组元素类型)2. 用首个元素大小
那有些人非要问,要是不知道元素的类型呢?这个时候我们可以直接用数组的第一个元素来算。一个数组,就算不知道有多少个元素,那起码会有1个吧(0长度数组除外,后面会学习)。这个时候我们可以直接用sizeof求首个元素的大小,然后就可以计算元素个数了:
array_len = sizeof(数组名) / sizeof(数组名[0]) // 多维数组的话也可以用同样的方式