C语言数组编程实例
目录
概念
数组的初始化
访问数组元素
注意事项
编程实例
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 3
int 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语言中的灵活使用!