当前位置: 首页 > article >正文

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语言中的灵活使用!


http://www.kler.cn/a/524650.html

相关文章:

  • JMeter插件 Arrivals Thread Group 源码解析:实现原理与性能测试中的应用
  • Unbutu虚拟机+eclipse+CDT编译调试环境搭建
  • [权限提升] Windows 提权 — 系统内核溢出漏洞提权
  • hive:数据导入,数据导出,加载数据到Hive,复制表结构
  • 54.数字翻译成字符串的可能性|Marscode AI刷题
  • Spring Boot 无缝集成SpringAI的函数调用模块
  • CTF从入门到精通
  • ollama如何将模型移动到D盘以及如何直接下载到D盘
  • CTFSHOW-WEB入门-命令执行39-53
  • 基于 WEB 开发的在线学习系统设计与开发
  • Ubuntu 16.04用APT安装MySQL
  • 掌握Java反射:在项目中高效应用反射机制
  • 价值交换到底在交换什么
  • 批量卸载fnm中已经安装的所有版本
  • 解决双系统引导问题:Ubuntu 启动时不显示 Windows 选项的处理方法
  • Redis学习之哨兵二
  • axios如何利用promise无痛刷新token
  • 计算机专业的多元就业方向
  • 基于 AWS SageMaker 对 DeepSeek-R1-Distilled-Llama-8B 模型的精调与实践
  • XCTF - IllIntentions wp
  • python实现一个完整的智能教室能耗监测与管理系统的实现方案
  • (2)SpringBoot自动装配原理简介
  • CSS语言的区块链
  • Vue 3 30天精进之旅:Day 08 - 组件通信
  • 锁升级过程与优化操作
  • 消息队列篇--通信协议篇--STOMP(STOMP特点、格式及示例,WebSocket上使用STOMP,消息队列上使用STOMP等)