Skip to content

LV005-数组简介

一、什么是数组

数组是 构造数据类型 之一,是具有一定顺序关系的若干个 变量集合,组成数组的各个变量称为数组的 元素,数组中各元素的 数据类型要求相同,用 数组名下标 确定。数组可以是一维的,也可以是多维的。它的核心特点是:

  • 内存连续:数组中的元素在内存中紧密排列。
  • 固定长度:数组一旦声明,大小不可改变。
  • 索引访问:通过下标(从 0 开始)定位元素。

例如,一个存储 5 个整数的数组就像 5 个连续的“格子”,每个格子可以通过编号(0 到 4)来访问。

Tips:总之,数组是一组有序的、类型相同的数据集合。

二、一维数组

1. 什么是一维数组

1.1 基本概念

一维数组是指 只有一个下标 的数组。它在计算机的内存中是 连续存储 的。

1.2 怎么声明?

c
storage_type data_type array_name[ array_size ];
storage_type 存储类型(可以说明也可以不说明)
data_type 任意有效的 C 数据类型(必须说明)
array_name 数组名称(必须说明)
array_size 数组长度(有些情况可以省略)

1.3 声明示例

c
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 怎么访问数组元素?

c
array_name[index]  /* 数组名 [元素索引(也可以说是下标)] 索引从 0 开始 */

例如:

c
int a[10];

printf(“%d”, a);          /* (错误) 这种访问方式是错误的 */

for(j=0;j<10;j++)
{
    printf(“%d\t”, a[j]); /* (正确) 这种情况才是正确的访问方式 */
}

【注意】

(1)数组必须定义之后才能够访问。

(2)数组的元素只能逐个访问,不能一次性访问整个数组。

(3)下标可以是整型表达式或者常量。

2.2 遍历一维数组

C
int a[10];
int i, n;

n = sizeof(a) / sizeof(int);

/* 通过for循环来逐个访问 */
for(j = 0; j < n; j++)
    printf(“%d\t”, a[j]); /* 逐个打印数组元素 */

3. 元素初始化

c
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 所占字节长度。

例如:

c
#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;
}

image-20260209141347821

a [3] 在内存中的结构如下图所示, a [3] 数组为 int 类型,在 64 位平台下占 4 个字节,所以相邻元素之间地址相差 4 。

image-20260209141723681

5. 数组名

一维数组的数组名代表了该数组的起始地址,可以通过该数名推出各个元素的地址,并通过指针(后边说,先提一下)进行访问。

c
#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;
}

image-20260209141815349

【注意】数组名 不可以进行自加自减 运算。

三、获取数组元素个数

怎么获取数组的大小?有两种方式。

1. 用元素类型

我们定义一个数组的时候是知道数组中元素的类型的,比如int a[2];,这个时候我们可以使用下面的方式获取数组元素个数:

c
array_len = sizeof(数组名) / sizeof(数组元素类型)

2. 用首个元素大小

那有些人非要问,要是不知道元素的类型呢?这个时候我们可以直接用数组的第一个元素来算。一个数组,就算不知道有多少个元素,那起码会有1个吧(0长度数组除外,后面会学习)。这个时候我们可以直接用sizeof求首个元素的大小,然后就可以计算元素个数了:

c
array_len = sizeof(数组名) / sizeof(数组名[0]) // 多维数组的话也可以用同样的方式