在上个系列【C 语言入门】里面,已经对数组和指针定义和使用做了初步的了解。在本文章中,将深入探索:如何在 C 语言中,如何使用数组来处理相同类型的批量数据。
数组概述
定义:数组是具有相同数据类型,并且按照一定顺序排列的一组变量的集合。
特征:
- 有序性:数组元素之间具有固定的先后顺序
- 可索引:通过数组名和下标可以唯一地确定数组中的元素
一维数组
一维数组的定义:
类型名 数组名[常量表达式]
NOTE:
- 数组名的命名遵循《C 语言标识符的命名规则》
- 标识符由字母、数字和下划线组成
- 第一个字母不能是数字,只能是字母或下划线
- 区分大小写:大写字母和小写字母不同
- C 语言规定了一个标识符的字符个数。C 语言规定标识符的最大长度可达 255 个字符,只有前 32 个字符在编译时有效。
- 在定义数组时,需要指定数组元素的个数,即数组长度。方括号 [ ] 中的常量表达式用于表示数组元素的个数。
Example 1:使用常量表达式指定数组长度
// 定义了一个 int 型的数组,数组长度为 4,具有 4 个数组元素
int a[4];
// 数组下标是从 0 开始
// 注意: 依据上面的定义,数组 a 仅有 4 个数组元素,
// 分别为:a[0]、 a[1]、 a[2]、 a[3],并不存在数组元素 a[4]
a[0] = 0; /* 将数组 a 的 第 0 个 数组元素赋值为 0 */
a[1] = 1; /* 将数组 a 的 第 1 个 数组元素赋值为 1 */
a[2] = 2; /* 将数组 a 的 第 2 个 数组元素赋值为 2 */
a[3] = 3; /* 将数组 a 的 第 3 个 数组元素赋值为 3 */
a[4] = 4; /* 错误! */
Example 2 :使用初始化列表指定数组长度。
//通过对全部数组元素赋初值来指定数组长度,此时,可以不指定数组长度。
char g_A_Array[] = {0, 1, 2, 3, 4, 5};
printf("g_A_Array's length is %d\r\n", sizeof(g_A_Array));
运行结果:
- C 语言不允许对数组的大小做动态定义。即:常量表达式可以包括常量和符号常量,但不能包含变量。
// 常量表达式可以包含常量
int a[4]; // 正确
int b[1 + 3]; // 正确
// 常量表达式可以包含符号常量
#define ArraySize 4
int c[ArraySize]; // 正确
// 常量表达式不可以包含变量
int n;
scanf("%d", &n);
int a[n]; // 错误
NOTE:如果在被调用的函数(不包含主函数)中定义数组,数组的长度可以是变量或非常量表达式,此数组称为“可变长数组,variable-length arrays(VLAs)”。
Example:
/* 数组 a 的数组长度表达式为在调用 func 函数时形参 n 从实参得到的值
* 允许在每次调用 func 函数时,n 有不同的值
* 称数组 a 为 可变长数组,variable-length arrays (VLAs)
* 若 a 数组为静态存储方式(static), 则不能用 VLAs,即 funb 的写法是错误的
* VLAs 为 C99 标准中新增的一项
*
* 值得注意的是,Visual Studio 不支持 VLAs
* 若在 Visual Studio 中使用 VLAs,会报 “error C2123:表达式的计算结果不是常量” 的错误*/
void func(int n)
{
int a[n]; /*正确*/
}
void funb(int n)
{
static int a[n]; /*错误*/
}