C 语言实例 – 输出数组元素(一文讲透)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

数组基础与初始化

在C语言中,数组是存储同类型数据的集合,可以理解为一个连续的内存空间,每个元素通过索引(从0开始)访问。例如,一个包含5个整数的数组,索引范围为0到4。数组的初始化是输出元素的基础步骤,需要先定义并赋值。

初始化数组的几种方式

  1. 静态初始化:在声明时直接赋值

    int numbers[] = {10, 20, 30, 40, 50};  // 自动计算数组长度  
    

    这里的numbers数组长度为5,编译器会根据初始化列表推导出元素个数。

  2. 显式指定长度:当初始化列表元素少于数组长度时,未初始化的元素默认为0:

    int scores[5] = {90, 85};  // scores[2]到scores[4]的值为0  
    
  3. 动态初始化:通过指针和malloc函数动态分配内存(进阶内容,后续展开):

    int *dynamicArray = (int *)malloc(3 * sizeof(int));  
    if (dynamicArray == NULL) {  
        // 处理内存分配失败  
    }  
    dynamicArray[0] = 100;  // 手动赋值  
    

基础输出方法:遍历与循环

输出数组元素的核心是遍历所有元素。C语言中常用for循环、while循环或do-while循环实现。以下是典型的输出案例:

案例1:逐个输出整型数组

#include <stdio.h>  

int main() {  
    int numbers[] = {1, 2, 3, 4, 5};  
    int size = sizeof(numbers) / sizeof(numbers[0]);  // 计算数组长度  

    printf("数组元素:\n");  
    for (int i = 0; i < size; i++) {  
        printf("第%d个元素:%d\n", i, numbers[i]);  
    }  
    return 0;  
}  

输出结果

数组元素:
第0个元素:1
第1个元素:2
第2个元素:3
第3个元素:4
第4个元素:5

关键点解释

  • sizeof运算符:通过sizeof(numbers)获取数组的总字节数,除以单个元素的字节数(sizeof(numbers[0])),得到元素个数。
  • 循环边界:确保循环变量i不超过数组长度(如i < size),避免访问越界(如numbers[5]可能引发未定义行为)。

指针视角:通过指针遍历数组

数组名本身是地址常量(指向首元素的指针),因此可以用指针实现遍历,这在理解底层机制时非常有用:

#include <stdio.h>  

int main() {  
    int arr[] = {5, 10, 15, 20};  
    int *ptr = arr;  // 指向数组首地址  

    printf("通过指针遍历:\n");  
    for (int i = 0; i < 4; i++) {  
        printf("元素值:%d\n", *(ptr + i));  // 使用指针偏移访问元素  
    }  
    return 0;  
}  

输出结果

通过指针遍历:
元素值:5
元素值:10
元素值:15
元素值:20

比喻理解

可以将数组想象成一个书架,每个元素是书本,索引是书的编号。指针就像一个“书架指针”,指向第一个书本的位置,通过“移动”指针(如ptr + i)可以访问不同位置的书本内容。


字符串数组的输出

字符串在C语言中本质是字符数组,以'\0'结尾。输出字符串数组时需注意遍历终止条件:

#include <stdio.h>  

int main() {  
    char *days[] = {"Monday", "Tuesday", "Wednesday", "Thursday"};  
    int count = sizeof(days) / sizeof(days[0]);  

    printf("一周中的前四天:\n");  
    for (int i = 0; i < count; i++) {  
        printf("%s\n", days[i]);  // 直接输出字符串指针  
    }  
    return 0;  
}  

输出结果

一周中的前四天:
Monday
Tuesday
Wednesday
Thursday

注意事项

  • 字符串数组的元素是字符指针,因此days[i]本身是地址,printf中的%s会自动处理字符串的遍历。
  • 若尝试直接赋值如char days[][10] = {"Monday", ...},需确保每个子数组的长度足够容纳字符串(含'\0')。

进阶技巧:多维数组与动态数组的输出

1. 多维数组的输出

多维数组本质是数组的数组。例如,二维数组的遍历需要双重循环:

#include <stdio.h>  

int main() {  
    int matrix[3][3] = {  
        {1, 2, 3},  
        {4, 5, 6},  
        {7, 8, 9}  
    };  

    printf("二维数组内容:\n");  
    for (int i = 0; i < 3; i++) {  
        for (int j = 0; j < 3; j++) {  
            printf("%d ", matrix[i][j]);  
        }  
        printf("\n");  
    }  
    return 0;  
}  

输出结果

二维数组内容:
1 2 3 
4 5 6 
7 8 9 

2. 动态数组的输出与内存管理

动态数组通过malloc分配内存,需手动释放空间:

#include <stdio.h>  
#include <stdlib.h>  

int main() {  
    int size = 3;  
    int *dynamicArr = (int *)malloc(size * sizeof(int));  

    if (dynamicArr == NULL) {  
        printf("内存分配失败!\n");  
        return 1;  
    }  

    // 赋值  
    for (int i = 0; i < size; i++) {  
        dynamicArr[i] = (i + 1) * 10;  
    }  

    // 输出  
    printf("动态数组元素:\n");  
    for (int i = 0; i < size; i++) {  
        printf("元素%d: %d\n", i, dynamicArr[i]);  
    }  

    // 释放内存  
    free(dynamicArr);  
    return 0;  
}  

输出结果

动态数组元素:
元素0: 10
元素1: 20
元素2: 30

常见问题与调试技巧

问题1:数组越界访问

当循环条件错误(如i <= size而非i < size)时,可能访问未分配的内存区域,导致程序崩溃或不可预测行为。

问题2:未初始化的元素

如:

int arr[5];  // 未初始化  
printf("%d", arr[0]);  // 输出随机值(取决于内存残留)  

解决方法:显式初始化或使用memset函数:

int arr[5] = {0};  // 全部初始化为0  

性能优化与注意事项

1. 避免重复计算数组长度

在循环中,sizeof(numbers) / sizeof(numbers[0])的计算在编译时已完成,但若数组是函数参数(如void func(int arr[])),sizeof(arr)会返回指针大小而非数组长度。因此建议:

  • 将数组长度作为参数传递:void func(int arr[], int size)

2. 使用const修饰只读数组

例如:

const char *months[] = {"Jan", "Feb", "..."};  

避免误修改常量数据。


总结与扩展

通过本文,我们系统学习了C语言中数组的初始化、遍历输出、多维数组处理等核心技能,并结合动态内存管理扩展了应用场景。对于编程初学者,建议通过以下步骤巩固知识:

  1. 练习基础案例:如输出斐波那契数列到数组中。
  2. 调试常见错误:尝试修改循环边界,观察程序崩溃现象。
  3. 探索进阶应用:如用数组实现栈或队列的简单数据结构。

掌握数组操作是C语言开发的基础,尤其在算法实现、底层编程中至关重要。希望这些C 语言实例 – 输出数组元素的案例能为你的学习提供清晰的路径!

最新发布