
一、数组的基本概念
1.1 什么是数组
数组是相同数据类型元素的集合,这些元素在内存中连续存储,通过下标访问。
1.2 数组的声明
数据类型 数组名[数组长度];示例:
int scores[50]; // 存储50个学生成绩
float temperatures[7]; // 存储一周温度
char name[20]; // 存储姓名二、一维数组
2.1 声明与初始化
// 方式1:先声明后赋值
int numbers[5];
numbers[0] = 10;
numbers[1] = 20;
// 方式2:声明时初始化
int numbers[5] = {10, 20, 30, 40, 50};
// 方式3:不指定长度,自动推断
int numbers[] = {1, 2, 3, 4, 5};
// 方式4:部分初始化,其余为0
int numbers[5] = {1, 2}; // [1,2,0,0,0]2.2 内存示意图
数组: int arr[5] = {10, 20, 30, 40, 50};
内存布局:
地址: 1000 1004 1008 1012 1016
下标: [0] [1] [2] [3] [4]
值: 10 20 30 40 502.3 实例:学生成绩统计
#include <stdio.h>
int main() {
int scores[10] = {85, 92, 78, 90, 65, 88, 76, 95, 80, 72};
int sum = 0;
float average;
int max = scores[0], min = scores[0];
// 计算总分、平均分、最高分、最低分
for(int i = 0; i < 10; i++) {
sum += scores[i];
if(scores[i] > max) max = scores[i];
if(scores[i] < min) min = scores[i];
}
average = (float)sum / 10;
printf("总分: %d\n", sum);
printf("平均分: %.2f\n", average);
printf("最高分: %d\n", max);
printf("最低分: %d\n", min);
return 0;
}三、二维数组
3.1 声明与初始化
// 3行4列的二维数组
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
// 部分初始化
int matrix[3][4] = {
{1, 2},
{5, 6, 7},
{9}
};3.2 内存示意图
二维数组: int arr[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}}
内存布局(按行存储):
行0: [0][0]=1 [0][1]=2 [0][2]=3 [0][3]=4
行1: [1][0]=5 [1][1]=6 [1][2]=7 [1][3]=8
行2: [2][0]=9 [2][1]=10 [2][2]=11 [2][3]=123.3 实例:矩阵运算
#include <stdio.h>
#define ROWS 3
#define COLS 3
int main() {
int matrix1[ROWS][COLS] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int matrix2[ROWS][COLS] = {
{9, 8, 7},
{6, 5, 4},
{3, 2, 1}
};
int result[ROWS][COLS];
// 矩阵相加
printf("矩阵相加结果:\n");
for(int i = 0; i < ROWS; i++) {
for(int j = 0; j < COLS; j++) {
result[i][j] = matrix1[i][j] + matrix2[i][j];
printf("%3d ", result[i][j]);
}
printf("\n");
}
return 0;
}四、字符数组与字符串
4.1 字符数组
// 字符数组声明
char str1[10] = {'H', 'e', 'l', 'l', 'o', '\0'};
char str2[] = "Hello"; // 自动添加'\0'
char str3[10] = "Hello";4.2 字符串处理函数
#include <stdio.h>
#include <string.h>
int main() {
char str1[20] = "Hello";
char str2[20] = "World";
char result[40];
// 字符串长度
printf("str1长度: %lu\n", strlen(str1));
// 字符串复制
strcpy(result, str1);
printf("复制结果: %s\n", result);
// 字符串连接
strcat(result, " ");
strcat(result, str2);
printf("连接结果: %s\n", result);
// 字符串比较
if(strcmp(str1, str2) == 0) {
printf("字符串相等\n");
} else {
printf("字符串不相等\n");
}
return 0;
}五、数组作为函数参数
5.1 传递一维数组
#include <stdio.h>
// 函数声明
void printArray(int arr[], int size);
void modifyArray(int arr[], int size);
int main() {
int numbers[5] = {1, 2, 3, 4, 5};
printf("原数组: ");
printArray(numbers, 5);
modifyArray(numbers, 5);
printf("修改后: ");
printArray(numbers, 5);
return 0;
}
// 打印数组
void printArray(int arr[], int size) {
for(int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
// 修改数组(每个元素加倍)
void modifyArray(int arr[], int size) {
for(int i = 0; i < size; i++) {
arr[i] *= 2;
}
}5.2 传递二维数组
#include <stdio.h>
// 必须指定列数
void printMatrix(int mat[][3], int rows) {
for(int i = 0; i < rows; i++) {
for(int j = 0; j < 3; j++) {
printf("%3d ", mat[i][j]);
}
printf("\n");
}
}
int main() {
int matrix[2][3] = {{1,2,3}, {4,5,6}};
printMatrix(matrix, 2);
return 0;
}六、综合实例:学生管理系统
#include <stdio.h>
#include <string.h>
#define MAX_STUDENTS 100
#define NAME_LENGTH 20
struct Student {
int id;
char name[NAME_LENGTH];
float score;
};
int main() {
struct Student students[MAX_STUDENTS];
int count = 0;
int choice;
do {
printf("\n=== 学生管理系统 ===\n");
printf("1. 添加学生\n");
printf("2. 显示所有学生\n");
printf("3. 查找学生\n");
printf("4. 统计平均分\n");
printf("0. 退出\n");
printf("请选择: ");
scanf("%d", &choice);
switch(choice) {
case 1: // 添加学生
if(count < MAX_STUDENTS) {
printf("输入学号: ");
scanf("%d", &students[count].id);
printf("输入姓名: ");
scanf("%s", students[count].name);
printf("输入成绩: ");
scanf("%f", &students[count].score);
count++;
printf("添加成功!\n");
} else {
printf("学生数量已达上限!\n");
}
break;
case 2: // 显示所有学生
printf("\n学号\t姓名\t成绩\n");
for(int i = 0; i < count; i++) {
printf("%d\t%s\t%.2f\n",
students[i].id,
students[i].name,
students[i].score);
}
break;
case 3: // 查找学生
{
char searchName[NAME_LENGTH];
printf("输入要查找的姓名: ");
scanf("%s", searchName);
int found = 0;
for(int i = 0; i < count; i++) {
if(strcmp(students[i].name, searchName) == 0) {
printf("找到学生: 学号=%d, 姓名=%s, 成绩=%.2f\n",
students[i].id, students[i].name, students[i].score);
found = 1;
}
}
if(!found) {
printf("未找到该学生!\n");
}
}
break;
case 4: // 统计平均分
if(count > 0) {
float sum = 0;
for(int i = 0; i < count; i++) {
sum += students[i].score;
}
printf("平均分: %.2f\n", sum / count);
} else {
printf("暂无学生数据!\n");
}
break;
}
} while(choice != 0);
return 0;
}七、重要注意事项
7.1 数组边界检查
int arr[5] = {1,2,3,4,5};
// 错误:访问越界
// printf("%d", arr[5]); // 未定义行为
// 正确做法
for(int i = 0; i < 5; i++) {
printf("%d ", arr[i]);
}7.2 数组初始化
// 错误:数组大小不能是变量(C89标准)
// int n = 10;
// int arr[n]; // 错误
// 正确:使用常量或宏定义
#define SIZE 10
int arr[SIZE];7.3 数组名与指针
int arr[5] = {1,2,3,4,5};
printf("%p\n", arr); // 数组首地址
printf("%p\n", &arr[0]); // 同上
printf("%d\n", *arr); // 第一个元素总结
数组是C语言中处理批量数据的重要工具,具有以下特点:
· 相同数据类型元素的集合 · 内存连续存储 · 通过下标访问元素 · 可以是一维、二维或多维 · 数组名代表数组首地址
掌握数组的使用对于C语言编程至关重要,特别是在处理大量相似数据时,数组提供了高效的数据组织和访问方式。