第4章 数组


进阶章节 重点掌握 数组是处理批量数据的重要工具

本章概述

数组是一组相同类型数据的集合,这些数据在内存中连续存放。数组是C语言中最基本的数据结构。

本章主要内容:

  • 一维数组的定义和使用
  • 二维数组的定义和使用
  • 字符数组与字符串
  • 数组作为函数参数
  • 常见算法:排序、查找

一维数组

定义和初始化

1
2
3
4
5
6
7
8
9
10
11
12
// 定义方式
类型 数组名[大小];

// 示例
int arr[5]; // 定义一个包含5个整数的数组
float scores[10]; // 定义一个包含10个浮点数的数组

// 初始化
int arr1[5] = {1, 2, 3, 4, 5}; // 完全初始化
int arr2[5] = {1, 2, 3}; // 部分初始化,其余为0
int arr3[] = {1, 2, 3, 4, 5}; // 自动确定大小
int arr4[5] = {0}; // 全部初始化为0

访问数组元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include 

int main() {
int arr[5] = {10, 20, 30, 40, 50};

// 访问单个元素
printf("第一个元素:%d\n", arr[0]); // 输出:10
printf("第三个元素:%d\n", arr[2]); // 输出:30

// 遍历数组
for (int i = 0; i < 5; i++) {
printf("arr[%d] = %d\n", i, arr[i]);
}

return 0;
}

⚠️ 注意事项

  • 数组下标从0开始
  • 访问数组时不要越界
  • 数组名是常量,不能修改

二维数组

定义和初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 定义方式
类型 数组名[行数][列数];

// 示例
int matrix[3][4]; // 3行4列的二维数组

// 初始化
int mat1[2][3] = {
{1, 2, 3},
{4, 5, 6}
};

int mat2[2][3] = {1, 2, 3, 4, 5, 6}; // 自动分行
int mat3[][3] = {1, 2, 3, 4, 5, 6}; // 省略行数

访问二维数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include 

int main() {
int matrix[2][3] = {
{1, 2, 3},
{4, 5, 6}
};

// 访问元素
printf("matrix[0][0] = %d\n", matrix[0][0]); // 输出:1
printf("matrix[1][2] = %d\n", matrix[1][2]); // 输出:6

// 遍历二维数组
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}

return 0;
}

💡 二维数组的应用

二维数组常用于表示矩阵、表格、游戏地图等二维数据结构。

字符数组与字符串

字符数组

1
2
char str1[5] = {'H', 'e', 'l', 'l', 'o'};  // 字符数组
char str2[] = "Hello"; // 字符串

字符串

字符串是以'\0'(空字符)结尾的字符数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include 
#include

int main() {
char str[] = "Hello";

// 字符串长度(不包括'\0')
printf("长度:%lu\n", strlen(str)); // 输出:5

// 输出字符串
printf("字符串:%s\n", str);

// 字符串拷贝
char str2[20];
strcpy(str2, str);
printf("拷贝:%s\n", str2);

// 字符串连接
strcat(str2, " World");
printf("连接:%s\n", str2);

// 字符串比较
if (strcmp(str, "Hello") == 0) {
printf("相等\n");
}

return 0;
}

常用字符串函数

函数 说明
strlen(s) 返回字符串s的长度
strcpy(dest, src) 将src复制到dest
strcat(dest, src) 将src连接到dest后面
strcmp(s1, s2) 比较两个字符串
strstr(s1, s2) 在s1中查找s2首次出现的位置

数组作为函数参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include 

// 函数声明
void printArray(int arr[], int size);
int sumArray(int arr[], int size);
void reverseArray(int arr[], int size);

int main() {
int arr[] = {1, 2, 3, 4, 5};
int size = sizeof(arr) / sizeof(arr[0]);

printf("原始数组:");
printArray(arr, size);

printf("数组之和:%d\n", sumArray(arr, size));

reverseArray(arr, size);
printf("反转后:");
printArray(arr, size);

return 0;
}

// 打印数组
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}

// 计算数组元素之和
int sumArray(int arr[], int size) {
int sum = 0;
for (int i = 0; i < size; i++) {
sum += arr[i];
}
return sum;
}

// 反转数组
void reverseArray(int arr[], int size) {
for (int i = 0; i < size / 2; i++) {
int temp = arr[i];
arr[i] = arr[size - 1 - i];
arr[size - 1 - i] = temp;
}
}

💡 注意

数组作为函数参数时会退化为指针,sizeof(arr)返回的是指针大小,需要在调用时传递数组大小。

常见算法

冒泡排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include 

void bubbleSort(int arr[], int size) {
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
// 交换
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}

int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int size = sizeof(arr) / sizeof(arr[0]);

bubbleSort(arr, size);

printf("排序后:");
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}

return 0;
}

二分查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include 

int binarySearch(int arr[], int size, int target) {
int left = 0, right = size - 1;

while (left <= right) {
int mid = left + (right - left) / 2;

if (arr[mid] == target) {
return mid;
}

if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}

return -1; // 未找到
}

int main() {
int arr[] = {2, 5, 8, 12, 16, 23, 38, 56, 72, 91};
int size = sizeof(arr) / sizeof(arr[0]);
int target = 23;

int result = binarySearch(arr, size, target);

if (result != -1) {
printf("找到元素,位置:%d\n", result);
} else {
printf("未找到元素\n");
}

return 0;
}

综合示例:学生成绩管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include 

#define MAX_STUDENTS 100
#define MAX_NAME 50

struct Student {
char name[MAX_NAME];
int score;
};

int main() {
struct Student students[MAX_STUDENTS];
int count = 0;
int choice;

while (1) {
printf("\n1. 添加学生\n");
printf("2. 显示所有学生\n");
printf("3. 计算平均分\n");
printf("4. 退出\n");
printf("请选择:");
scanf("%d", &choice);

if (choice == 1) {
printf("姓名:");
scanf("%s", students[count].name);
printf("成绩:");
scanf("%d", &students[count].score);
count++;
} else if (choice == 2) {
for (int i = 0; i < count; i++) {
printf("%s: %d\n", students[i].name, students[i].score);
}
} else if (choice == 3) {
int sum = 0;
for (int i = 0; i < count; i++) {
sum += students[i].score;
}
printf("平均分:%.2f\n", (float)sum / count);
} else if (choice == 4) {
break;
}
}

return 0;
}

本章小结

  • ✓ 掌握了一维数组和二维数组的使用
  • ✓ 理解了字符数组与字符串的关系
  • ✓ 学会了数组作为函数参数
  • ✓ 掌握了基本的排序和查找算法

下一步学习


© 2025 Rl. 使用 Stellar 创建
站点访问量 Loading... 站点访客数 Loading... 页面访问量 Loading...