目录
概念
数组的初始化
访问数组元素
注意事项
编程实例
1. 基础操作
2. 常见算法
实际应用
4. 高级技巧
5. 应用场景
总结
概念
在C语言中,数组是一种用于存储相同类型数据项的集合。数组中的每个元素都拥有相同的变量名和数据类型,并通过索引来区分不同的元素。数组为处理大量相同类型的数据提供了一种有效的方法,使得代码更加简洁和易于管理。
1.一维数组:最简单的数组形式,可以看作是线性表。声明格式:
type arrayName[arraySize];
其中type是数组中元素的数据类型,arrayName是数组的名字,arraySize定义了数组能容纳的元素个数。
2.多维数组:除了最常见的二维数组外,还可以有三维甚至更多维度的数组。二维数组常用来表示矩阵或表格。声明格式(以二维数组为例):
type arrayName[rowSize][columnSize];
数组的初始化
数组可以在声明时进行初始化,对于一维数组:
int numbers[] = {1, 2, 3, 4, 5};
对于二维数组:
int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
如果没有明确指定数组大小,编译器会根据提供的初始化列表自动确定数组大小。
访问数组元素
数组元素通过索引访问,索引从0开始。例如,对于一个名为arr的一维数组,arr[0]表示第一个元素,arr[1]表示第二个元素,以此类推。
数组与指针的关系
指针数组与动态数据访问-CSDN博客
注意事项
1.数组的大小一旦确定,在程序运行期间不能改变。
2.访问超出数组范围的元素会导致未定义行为,可能会导致程序崩溃或产生不可预料的结果。
3.C语言不进行边界检查,因此程序员需要自己确保不会发生越界访问。
数组是C语言中最基本的数据结构之一,广泛应用于各种编程场景中,理解数组的工作原理和使用方法对于编写高效的C程序至关重要。
编程实例
1. 基础操作
示例1:数组初始化、遍历与求和
#include <stdio.h>int main() {int arr[5] = {10, 20, 30, 40, 50}; // 初始化数组int sum = 0;// 遍历数组并求和for (int i = 0; i < 5; i++) {printf("arr[%d] = %d\n", i, arr[i]);sum += arr[i];}printf("数组元素总和:%d\n", sum);return 0;
}
输出:
arr[0] = 10
arr[1] = 20
...
数组元素总和:150
示例2:查找数组中的最大值
#include <stdio.h>int main() {int arr[] = {3, 7, 2, 9, 5};int max = arr[0]; // 假设第一个元素是最大值int size = sizeof(arr) / sizeof(arr[0]); // 计算数组长度for (int i = 1; i < size; i++) {if (arr[i] > max) {max = arr[i];}}printf("最大值:%d\n", max);return 0;
}
输出:
最大值:9
2. 常见算法
示例3:冒泡排序(升序)
#include <stdio.h>//冒泡排序函数
void bubbleSort(int arr[], int size) {for (int i = 0; i < size - 1; i++) {for (int j = 0; j < size - i - 1; j++) {if (arr[j] > arr[j + 1]) {// 交换元素int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}//主函数
int main() {int arr[] = {5, 3, 8, 1, 2};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 5 8
示例4:二维数组(矩阵转置)
#include <stdio.h>#define ROWS 3
#define COLS 3int main() {int matrix[ROWS][COLS] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};int transposed[COLS][ROWS];// 转置矩阵for (int i = 0; i < ROWS; i++) {for (int j = 0; j < COLS; j++) {transposed[j][i] = matrix[i][j];}}// 打印转置结果printf("转置矩阵:\n");for (int i = 0; i < COLS; i++) {for (int j = 0; j < ROWS; j++) {printf("%d ", transposed[i][j]);}printf("\n");}return 0;
}
输出:
转置矩阵:
1 4 7
2 5 8
3 6 9
实际应用
示例5:动态数组(使用指针)
#include <stdio.h>
#include <stdlib.h>int main() {int size;printf("输入数组大小:");scanf("%d", &size);// 动态分配内存int *arr = (int *)malloc(size * sizeof(int));if (arr == NULL) {printf("内存分配失败!");return 1;}// 输入元素for (int i = 0; i < size; i++) {printf("输入元素 %d:", i);scanf("%d", &arr[i]);}// 输出元素printf("动态数组内容:");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}free(arr); // 释放内存return 0;
}
示例6:字符串数组(统计元音字母)
#include <stdio.h>
#include <string.h>int main() {char str[] = "Hello, World!";int vowels = 0;for (int i = 0; i < strlen(str); i++) {char c = str[i];if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' ||c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U') {vowels++;}}printf("元音字母数量:%d\n", vowels);return 0;
}
输出:
元音字母数量:3
4. 高级技巧
示例7:数组作为函数参数
#include <stdio.h>// 函数参数传递数组(本质是指针)
void printArray(int arr[], int size) {for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}
}int main() {int arr[] = {10, 20, 30, 40, 50};int size = sizeof(arr) / sizeof(arr[0]);printArray(arr, size);return 0;
}
示例8:数组越界问题(错误示例)
#include <stdio.h>int main() {int arr[3] = {1, 2, 3};arr[3] = 4; // 越界访问,可能导致程序崩溃或数据损坏printf("%d", arr[3]);return 0;
}
警告: 数组越界是未定义行为(UB),需严格避免!
5. 应用场景
示例9:学生成绩统计
#include <stdio.h>int main() {int scores[5] = {85, 92, 78, 90, 88};int total = 0;float average;for (int i = 0; i < 5; i++) {total += scores[i];}average = (float)total / 5;printf("总分:%d\n平均分:%.2f\n", total, average);return 0;
}
示例10:反转数组
#include <stdio.h>void reverseArray(int arr[], int size) {int start = 0;int end = size - 1;while (start < end) {int temp = arr[start];arr[start] = arr[end];arr[end] = temp;start++;end--;}
}int main() {int arr[] = {1, 2, 3, 4, 5};int size = sizeof(arr) / sizeof(arr[0]);reverseArray(arr, size);printf("反转后的数组:");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}return 0;
}
总结
-
数组核心操作:遍历、查找、排序、动态内存分配。
-
注意点:数组越界、内存管理(动态数组)、多维数组的维度计算。
-
应用方向:数据处理、字符串操作、算法实现(如排序、搜索)。
通过以上实例,可以逐步掌握数组在C语言中的灵活使用!