目录
- 数组的基本概念
- 一维数组的声明、初始化与使用
- 一维数组在内存中的存储
- 二维数组的声明、初始化与使用
- 二维数组在内存中的存储
- 数组越界问题
- 数组作为函数参数
- 应用实例:冒泡排序
- 扩展应用:三子棋与扫雷游戏
1. 数组的基本概念
数组是一组相同类型元素的集合,通过下标访问元素。分为一维数组和二维数组:
- 一维数组:线性结构,元素按顺序存储。
- 二维数组:可视为“数组的数组”,常用于表示矩阵或表格。
2. 一维数组的声明、初始化与使用
2.1 声明与初始化
// 完全初始化
int arr1[5] = {1, 2, 3, 4, 5};
// 不完全初始化(剩余元素自动补0)
int arr2[5] = {1, 2};
// 省略数组大小(编译器自动计算)
int arr3[] = {1, 2, 3}; // 等价于 int arr3[3] = {1, 2, 3};
2.2 访问与遍历
#include <stdio.h>
int main() {
int arr[5] = {10, 20, 30, 40, 50};
int sz = sizeof(arr) / sizeof(arr[0]); // 计算数组长度
for (int i = 0; i < sz; i++) {
printf("arr[%d] = %d\n", i, arr[i]);
}
return 0;
}
输出结果:
arr[0] = 10
arr[1] = 20
...
arr[4] = 50
3. 一维数组在内存中的存储
数组元素在内存中是连续存储的,每个元素的地址按数据类型大小递增:
#include <stdio.h>
int main() {
int arr[3] = {0};
for (int i = 0; i < 3; i++) {
printf("&arr[%d] = %p\n", i, &arr[i]);
}
return 0;
}
输出结果(示例):
&arr[0] = 0x7ffd42a1a3c0
&arr[1] = 0x7ffd42a1a3c4 // 相差4字节(int类型大小)
&arr[2] = 0x7ffd42a1a3c8
4. 二维数组的声明、初始化与使用
4.1 声明与初始化
// 完全初始化
int arr1[2][3] = {{1, 2, 3}, {4, 5, 6}};
// 行可省略,列不可省略
int arr2[][3] = {{1}, {4, 5}}; // 未初始化的元素补0
// 连续初始化(按行填充)
int arr3[2][3] = {1, 2, 3, 4, 5, 6};
4.2 遍历二维数组
#include <stdio.h>
int main() {
int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
return 0;
}
输出结果:
1 2 3
4 5 6
5. 二维数组在内存中的存储
二维数组在内存中按行连续存储:
#include <stdio.h>
int main() {
int arr[2][3] = {0};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
}
}
return 0;
}
输出结果(示例):
&arr[0][0] = 0x7ffd42a1a3c0
&arr[0][1] = 0x7ffd42a1a3c4 // 连续存储
&arr[0][2] = 0x7ffd42a1a3c8
&arr[1][0] = 0x7ffd42a1a3cc // 下一行起始地址
...
6. 数组越界问题
C语言不强制检查数组越界,需程序员自行避免:
int arr[3] = {1, 2, 3};
printf("%d", arr[3]); // 越界访问,结果不可预测
7. 数组作为函数参数
数组名本质是首元素地址,传递时会退化为指针:
#include <stdio.h>
void printArray(int arr[], int sz) {
for (int i = 0; i < sz; i++) {
printf("%d ", arr[i]);
}
}
int main() {
int arr[] = {1, 2, 3};
int sz = sizeof(arr) / sizeof(arr[0]);
printArray(arr, sz); // 传递数组名和长度
return 0;
}
8. 应用实例:冒泡排序
正确传递数组长度的冒泡排序实现:
#include <stdio.h>
void bubbleSort(int arr[], int sz) {
for (int i = 0; i < sz - 1; i++) {
for (int j = 0; j < sz - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
int main() {
int arr[] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};
int sz = sizeof(arr) / sizeof(arr[0]);
bubbleSort(arr, sz);
for (int i = 0; i < sz; i++) {
printf("%d ", arr[i]); // 输出:0 1 2 3 4 5 6 7 8 9
}
return 0;
}

被折叠的 条评论
为什么被折叠?



