C 语言数组操作
外观
C语言数组操作[编辑 | 编辑源代码]
介绍[编辑 | 编辑源代码]
数组是C语言中一种重要的数据结构,用于存储相同类型的多个元素。数组操作包括创建、初始化、访问、修改、遍历以及多维数组的处理。掌握数组操作是学习C语言的关键步骤之一,因为数组广泛应用于数据处理、算法实现和内存管理等领域。
数组的特点:
- 元素类型相同
- 内存连续分配
- 通过索引(下标)访问
- 大小固定(静态数组)
数组声明与初始化[编辑 | 编辑源代码]
一维数组[编辑 | 编辑源代码]
一维数组的声明语法:
数据类型 数组名[数组大小];
示例:
int numbers[5]; // 声明一个包含5个整数的数组
初始化方式:
// 方式1:声明时初始化
int numbers[5] = {1, 2, 3, 4, 5};
// 方式2:部分初始化(剩余元素自动初始化为0)
int numbers[5] = {1, 2};
// 方式3:自动确定大小
int numbers[] = {1, 2, 3, 4, 5}; // 编译器自动计算大小为5
多维数组[编辑 | 编辑源代码]
C语言支持多维数组,最常见的是二维数组(矩阵)。
声明语法:
数据类型 数组名[行数][列数];
示例:
int matrix[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
基本数组操作[编辑 | 编辑源代码]
访问数组元素[编辑 | 编辑源代码]
数组元素通过索引访问,索引从0开始。
示例:
int numbers[5] = {10, 20, 30, 40, 50};
printf("%d", numbers[2]); // 输出:30
修改数组元素[编辑 | 编辑源代码]
numbers[1] = 25; // 将第二个元素改为25
遍历数组[编辑 | 编辑源代码]
使用循环结构遍历数组:
for(int i = 0; i < 5; i++) {
printf("%d ", numbers[i]);
}
// 输出:10 25 30 40 50
数组与指针的关系[编辑 | 编辑源代码]
在C语言中,数组名本质上是指向数组第一个元素的指针。
示例:
int numbers[3] = {1, 2, 3};
int *ptr = numbers; // ptr指向数组首元素
printf("%d", *ptr); // 输出:1
printf("%d", *(ptr + 1)); // 输出:2
常见数组操作函数[编辑 | 编辑源代码]
虽然C语言没有内置的数组操作函数,但可以自己实现:
数组复制[编辑 | 编辑源代码]
void arrayCopy(int src[], int dest[], int size) {
for(int i = 0; i < size; i++) {
dest[i] = src[i];
}
}
数组求和[编辑 | 编辑源代码]
int arraySum(int arr[], int size) {
int sum = 0;
for(int i = 0; i < size; i++) {
sum += arr[i];
}
return sum;
}
数组的内存表示[编辑 | 编辑源代码]
数组在内存中是连续存储的。例如,一个包含3个整数的数组:
内存地址计算:
实际应用案例[编辑 | 编辑源代码]
案例1:成绩统计[编辑 | 编辑源代码]
计算学生平均成绩:
#include <stdio.h>
int main() {
float grades[5] = {85.5, 90.0, 78.5, 92.5, 88.0};
float sum = 0.0;
for(int i = 0; i < 5; i++) {
sum += grades[i];
}
printf("平均成绩: %.2f\n", sum / 5);
return 0;
}
输出:
平均成绩: 86.90
案例2:矩阵转置[编辑 | 编辑源代码]
实现3x3矩阵的转置:
#include <stdio.h>
void transpose(int matrix[3][3]) {
int temp;
for(int i = 0; i < 3; i++) {
for(int j = i + 1; j < 3; j++) {
temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}
}
int main() {
int matrix[3][3] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
transpose(matrix);
// 打印转置后的矩阵
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 3; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
return 0;
}
输出:
1 4 7 2 5 8 3 6 9
常见错误与注意事项[编辑 | 编辑源代码]
1. 数组越界:访问超出数组范围的索引会导致未定义行为
int arr[3] = {1, 2, 3};
printf("%d", arr[3]); // 错误!有效索引是0-2
2. 数组大小必须为常量(在标准C中)
int size = 5;
int arr[size]; // 在C99之前是错误,C99支持变长数组
3. 数组名不是指针(虽然可以转换为指针)
int arr[5];
printf("%zu", sizeof(arr)); // 输出整个数组的大小,不是指针大小
高级主题[编辑 | 编辑源代码]
动态数组[编辑 | 编辑源代码]
使用指针和内存分配函数创建动态大小的数组:
#include <stdlib.h>
int main() {
int size = 10;
int *dynamicArray = (int*)malloc(size * sizeof(int));
if(dynamicArray != NULL) {
for(int i = 0; i < size; i++) {
dynamicArray[i] = i * 2;
}
// 使用数组...
free(dynamicArray); // 释放内存
}
return 0;
}
数组作为函数参数[编辑 | 编辑源代码]
数组作为函数参数时,实际上传递的是指向数组第一个元素的指针:
void printArray(int arr[], int size) {
for(int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
}
// 调用
int numbers[5] = {1, 2, 3, 4, 5};
printArray(numbers, 5);
总结[编辑 | 编辑源代码]
C语言数组是基础而强大的数据结构,理解数组操作对于掌握C语言编程至关重要。从简单的元素访问到复杂的多维数组处理,数组在各种编程场景中都有广泛应用。记住数组的固定大小特性和指针关系,可以避免许多常见错误。随着编程经验的积累,你会发现在更复杂的数据结构和算法中,数组操作仍然是基础中的基础。