数组详解
数组就像一排有编号的盒子,用来存储一组相同类型的数据!
什么是数组?
想象一个班级的座位:
[座位0] [座位1] [座位2] [座位3] [座位4]
张三 李四 王五 赵六 钱七
数组的声明和初始化
语法
数据类型 数组名[元素个数];
示例
#include <stdio.h>
int main() {
// 声明并初始化
int scores[5] = {85, 90, 78, 92, 88};
// 部分初始化(其余为0)
int nums[5] = {1, 2, 3}; // {1, 2, 3, 0, 0}
// 全部初始化为0
int zeros[5] = {0};
// 自动推断大小
int auto_arr[] = {1, 2, 3, 4, 5}; // 大小为5
return 0;
}
访问数组元素
使用下标(索引)访问,从0开始!
#include <stdio.h>
int main() {
int arr[5] = {10, 20, 30, 40, 50};
printf("第1个元素:%d\n", arr[0]); // 10
printf("第2个元素:%d\n", arr[1]); // 20
printf("第5个元素:%d\n", arr[4]); // 50
// 修改元素
arr[2] = 100;
printf("修改后第3个元素:%d\n", arr[2]); // 100
return 0;
}
注意
数组下标从0开始,长度为n的数组,有效下标是0到n-1!
int arr[5];
arr[0] = 1; // ✅ 正确
arr[4] = 2; // ✅ 正确
arr[5] = 3; // ❌ 越界!未定义行为
遍历数组
使用for循环
#include <stdio.h>
int main() {
int scores[5] = {85, 90, 78, 92, 88};
printf("所有成绩:\n");
for (int i = 0; i < 5; i++) {
printf("scores[%d] = %d\n", i, scores[i]);
}
return 0;
}
计算数组长度
int arr[10];
int length = sizeof(arr) / sizeof(arr[0]);
解释
sizeof(arr)- 整个数组的字节数sizeof(arr[0])- 单个元素的字节数- 相除得到元素个数
数组作为函数参数
#include <stdio.h>
// 方法1
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
// 方法2(等价)
void printArray2(int *arr, int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int nums[] = {1, 2, 3, 4, 5};
int size = sizeof(nums) / sizeof(nums[0]);
printArray(nums, size);
return 0;
}
重要
数组作为参数传递时,传递的是地址,不是副本! 所以在函数内修改数组,会影响原数组。
多维数组
二维数组
#include <stdio.h>
int main() {
// 3行4列的二维数组
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
// 访问元素
printf("第2行第3列:%d\n", matrix[1][2]); // 7
// 遍历
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%3d ", matrix[i][j]);
}
printf("\n");
}
return 0;
}
输出:
1 2 3 4
5 6 7 8
9 10 11 12
实战案例
案例1:求数组最大值
#include <stdio.h>
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;
}
int main() {
int nums[] = {23, 67, 12, 89, 45, 34};
int size = sizeof(nums) / sizeof(nums[0]);
int max = findMax(nums, size);
printf("最大值:%d\n", max);
return 0;
}
案例2:计算平均分
#include <stdio.h>
float calculateAverage(int scores[], int size) {
int sum = 0;
for (int i = 0; i < size; i++) {
sum += scores[i];
}
return (float)sum / size;
}
int main() {
int scores[] = {85, 90, 78, 92, 88};
int size = sizeof(scores) / sizeof(scores[0]);
float avg = calculateAverage(scores, size);
printf("平均分:%.2f\n", avg);
return 0;
}
案例3:数组反转
#include <stdio.h>
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;
}
}
void printArray(int arr[], int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int nums[] = {1, 2, 3, 4, 5};
int size = sizeof(nums) / sizeof(nums[0]);
printf("原数组:");
printArray(nums, size);
reverseArray(nums, size);
printf("反转后:");
printArray(nums, size);
return 0;
}
案例4:冒泡排序
#include <stdio.h>
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 nums[] = {64, 34, 25, 12, 22, 11, 90};
int size = sizeof(nums) / sizeof(nums[0]);
printf("排序前:");
for (int i = 0; i < size; i++) {
printf("%d ", nums[i]);
}
printf("\n");
bubbleSort(nums, size);
printf("排序后:");
for (int i = 0; i < size; i++) {
printf("%d ", nums[i]);
}
printf("\n");
return 0;
}
案例5:统计成绩等级
#include <stdio.h>
int main() {
int scores[] = {85, 92, 78, 65, 95, 88, 72, 55, 90, 60};
int size = sizeof(scores) / sizeof(scores[0]);
int gradeCount[5] = {0}; // A, B, C, D, F
for (int i = 0; i < size; i++) {
if (scores[i] >= 90) {
gradeCount[0]++; // A
} else if (scores[i] >= 80) {
gradeCount[1]++; // B
} else if (scores[i] >= 70) {
gradeCount[2]++; // C
} else if (scores[i] >= 60) {
gradeCount[3]++; // D
} else {
gradeCount[4]++; // F
}
}
printf("=== 成绩统计 ===\n");
printf("A(90-100):%d人\n", gradeCount[0]);
printf("B(80-89):%d人\n", gradeCount[1]);
printf("C(70-79):%d人\n", gradeCount[2]);
printf("D(60-69):%d人\n", gradeCount[3]);
printf("F(0-59):%d人\n", gradeCount[4]);
return 0;
}
练习题
练习1:查找元素
在数组中查找指定元素,返回其下标(找不到返回-1)。
练习2:数组去重
从数组中删除重复元素。
练习3:二维数组求和
计算二维数组每行和每列的和。
答案参考
查看答案
练习1:
#include <stdio.h>
int search(int arr[], int size, int target) {
for (int i = 0; i < size; i++) {
if (arr[i] == target) {
return i;
}
}
return -1;
}
int main() {
int nums[] = {10, 20, 30, 40, 50};
int size = sizeof(nums) / sizeof(nums[0]);
int index = search(nums, size, 30);
if (index != -1) {
printf("找到了,下标:%d\n", index);
} else {
printf("未找到\n");
}
return 0;
}
知识点总结
- ✅ 数组存储相同类型的多个数据
- ✅ 下标从0开始
- ✅
sizeof(arr)/sizeof(arr[0])获取长度 - ✅ 数组作参数传递的是地址
- ✅ 二维数组:
arr[row][col]
下一步
👉 指针详解