我们终会闪耀的像VVS
摘要:数组是C语言中最基础却最重要的数据结构之一。本文将从零开始讲解数组的概念、用法及常见问题,助你快速掌握这一核心知识点!
什么是数组?
1.数组的定义:
数组是一组相同数据类型元素的集合,这些元素在内存中连续存储,并通过下标(索引)访问。
例如:存储全班50人的成绩时,无需定义50个变量,只需一个数组即可轻松管理
2.关键特性:
1.元素类型相同
数组内的所有元素必须为同一数据类型
例如:
// ✅ 正确:所有元素均为int类型
int numbers[5] = {10, 20, 30, 40, 50};
// ❌ 错误:混合类型(int和char)
int mixedArr[3] = {1, 'A', 3};
// 实际会编译通过('A'被转为ASCII码65),但逻辑混乱,不建议!
// ❌ 错误:类型不匹配(int vs float)
float temperatures[3] = {25.5, 30, 18.0};
// 30是int,会被隐式转为float,合法但不规范
2.长度固定(编译时确定)
数组长度必须在编译时确定,无法在运行时动态改变
例如:
// ✅ 正确:编译时已知长度(5)
int arr1[5];
// ❌ 错误:使用变量作为长度(C89标准不支持)
int size = 10;
int arr2[size]; // C99允许(变长数组),但非所有编译器支持
// ❌ 错误:尝试扩展数组长度
int arr3[3] = {1,2,3};
arr3[3] = 4; // 越界访问!可能覆盖其他内存区域
3.下标从0开始
数组下标从0
开始,最大有效下标为长度-1
例如:
int scores[5] = {90, 85, 77, 95, 80};
// ✅ 正确访问
printf("第一个元素: %d\n", scores[0]); // 输出90
printf("最后一个元素: %d\n", scores[4]); // 输出80
// ❌ 常见错误:从1开始循环
for (int i = 1; i <= 5; i++) {
printf("%d ", scores[i]); // 当i=5时越界访问scores[5]
}
// ✅ 正确遍历方式
for (int i = 0; i < 5; i++) {
printf("%d ", scores[i]);
}
3.小结:
通过具体例子可以看出:
- 类型相同:避免混合数据类型,确保逻辑清晰。
- 长度固定:编译时确定大小,越界访问危险极高。
- 下标从0:循环时务必注意边界条件(
i < length
)。
牢记这三个特性,能有效避免数组使用中的大部分错误 ! ! !
一维数组详解 声明与初始化 访问与遍历
1. 声明与初始化
基本格式:
//伪代码
int arr [] = {0}
数据类型 数组名称 数组内元素个数 所存的元素
例如:声明一个长度为5的整型数组(注意只声明未初始化)
int numbers[5];
声明并初始化:
//(方式一)
int scores[5] = {90, 85, 77, 95, 80};
// 自动推断长度(方式二)
float temperatures[] = {22.5, 23.0, 24.3}; // 长度为3
2. 访问与遍历
通过下标访问元素(下标范围:0 到 数组长度-1):
int scores[5] = {90, 85, 77, 95, 80};//声明并初始化
scores[0] = 90; // 修改第一个元素
printf("第三位成绩:%d", scores[2]); // 输出第三个元素
// 使用for循环遍历数组
for(int i = 0; i < 5; i++) {
printf("第%d个元素:%d\n", i+1, scores[i]);
}
运行结果:(符合以上预期)
二维数组:表格化的数据存储
二维数组可视为“数组的数组”,常用于表示矩阵、表格等结构化数据。
1. 声明与初始化
声明3行4列的二维数组(未初始化)
// 声明3行4列的二维数组
int matrix[3][4];
声明并初始化
// 声明并初始化
int matrix2[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
2. 遍历二维数组
for(int row = 0; row < 2; row++) {
for(int col = 0; col < 3; col++) {
printf("%d ", matrix2[row][col]);
}
printf("\n");
}//第一个循环代表行 第二个循环代表列
运行结果:(符合以上预期):
3.注意点
二维数组在声明时如:
int matrix[3][4];
其中[3]可以省略但是[4]一定不能省略!!!!!!!!
因为不仅一维数组在内存中连续存储,多维数组(如二维数组、三维数组等)也是连续存储的,通常按行优先或列优先的顺序存储,但元素在内存中仍然是连续排列的。
上图为理解中的二维数组
下图为实际储存的二维数组
数组的常见问题与避坑指南
1. 数组越界访问
例如:
int arr[5] = {1,2,3,4,5};
printf("%d", arr[5]); // 错误!合法下标为0-4
**后果**:可能导致程序崩溃或输出不可预知的值。
2. 初始化值不足
例如:
int arr[5] = {1,2}; // 后三个元素自动初始化为0
3. 数组长度计算
例如:
int arr[5] = {1,2}; // 后三个元素自动初始化为0
实战练习:数组应用案例
案例1:求数组最大值
int findMax(int arr[], int size) {
int max = arr[0];
for(int i=1; i<size; i++) {
if(arr[i] > max) max = arr[i];
}
return max;
}
案例2:矩阵转置
void transpose(int mat[][3], int rows) {
int temp;
for(int i=0; i<rows; i++) {
for(int j=i+1; j<3; j++) {
temp = mat[i][j];
mat[i][j] = mat[j][i];
mat[j][i] = temp;
}
}
}
总结
数组是组织数据的强大工具,熟练掌握后可为后续学习字符串、结构体等打下基础。**动手实践**是掌握数组的关键,建议尝试自己编写排序、查找等算法!