C语言数组详解:从基础到进阶的全面解析
在C语言中,数组是一种基本的数据结构,用于存储多个相同类型的数据。数组的引入使得C语言能够高效地存储和操作大量数据。在任何一个C语言程序中,数组都发挥着极其重要的作用。无论是在算法实现、数据存储、还是在复杂程序的设计中,数组都是不可或缺的一部分。
本文将从C语言数组的基础知识入手,详细介绍数组的定义、初始化、操作技巧、常见应用以及进阶操作,帮助你全面理解C语言中的数组。
1. 数组基础
1.1 数组的定义与声明
在C语言中,数组是由相同数据类型的元素组成的一个集合。数组的声明需要指定数组的类型、名称和大小。
数组的定义
C语言数组的定义格式为:
type array_name[array_size];
type:数组元素的数据类型,可以是int、float、char等。array_name:数组的名称,用于引用该数组。array_size:数组的大小,即该数组包含的元素数量。
示例
int arr[5]; // 定义一个包含5个整数的数组
char str[10]; // 定义一个包含10个字符的数组
1.2 数组的初始化
数组在声明时可以进行初始化,数组元素的初值可以通过一对大括号 {} 来给定。初始化时,如果数组中的元素没有被显式赋值,C语言会自动将它们初始化为零。
完全初始化
可以直接给出所有元素的初值:
int arr[5] = {1, 2, 3, 4, 5};
部分初始化
可以只初始化部分元素,其余元素会被自动设置为零:
int arr[5] = {1, 2}; // 数组变为 {1, 2, 0, 0, 0}
自动推算数组大小
当我们已经给出所有初始化值时,可以省略数组的大小,C语言会根据初始化值的数量推算出数组的大小:
int arr[] = {1, 2, 3, 4, 5}; // 数组大小为5
1.3 数组元素的访问
C语言数组是基于下标(索引)访问的,数组的下标从 0 开始,因此第一个元素的下标是 0,第二个元素的下标是 1,以此类推。

int arr[5] = {1, 2, 3, 4, 5};
printf("%d\n", arr[0]); // 输出 1
printf("%d\n", arr[4]); // 输出 5
1.4 多维数组
C语言支持多维数组,二维数组是最常见的类型,它类似于一个矩阵。在二维数组中,第一个维度表示行,第二个维度表示列。
二维数组的定义
int matrix[3][3] = {{1, 2, 3},{4, 5, 6},{7, 8, 9}
};

访问二维数组中的元素:
printf("%d\n", matrix[0][1]); // 输出 2
printf("%d\n", matrix[2][2]); // 输出 9
2. 数组的基本操作
2.1 数组遍历
遍历数组是操作数组时最常见的方式之一,常用的循环结构有 for 和 while 循环。
遍历一维数组
#include <stdio.h>int main() {int arr[5] = {1, 2, 3, 4, 5};// 使用for循环遍历数组for (int i = 0; i < 5; i++) {printf("%d ", arr[i]);}return 0;
}
输出:
1 2 3 4 5
遍历二维数组
#include <stdio.h>int main() {int matrix[2][3] = {{1, 2, 3},{4, 5, 6}};// 使用嵌套for循环遍历二维数组for (int i = 0; i < 2; i++) {for (int j = 0; j < 3; j++) {printf("%d ", matrix[i][j]);}printf("\n");}return 0;
}
输出:
1 2 3
4 5 6
2.2 数组的求和与平均值
我们可以通过遍历数组来求和,然后计算数组的平均值。
示例:计算一维数组的和与平均值
#include <stdio.h>int main() {int arr[5] = {1, 2, 3, 4, 5};int sum = 0;int n = 5;// 求和for (int i = 0; i < n; i++) {sum += arr[i];}// 计算平均值float average = (float)sum / n;printf("Sum: %d\n", sum);printf("Average: %.2f\n", average);return 0;
}
输出:
Sum: 15
Average: 3.00
2.3 数组元素的交换
数组中的元素交换通常需要一个临时变量来保存某个元素的值。
示例:交换数组中两个元素
#include <stdio.h>int main() {int arr[5] = {1, 2, 3, 4, 5};// 交换第1个和第5个元素int temp = arr[0];arr[0] = arr[4];arr[4] = temp;// 打印交换后的数组for (int i = 0; i < 5; i++) {printf("%d ", arr[i]);}return 0;
}
输出:
5 2 3 4 1
2.4 数组的反转
反转数组是将数组元素的顺序颠倒。我们可以使用双指针技巧来反转数组,即一个指针从数组的起始位置向后移动,另一个指针从数组的末尾向前移动,交换它们指向的元素。
示例:反转数组
#include <stdio.h>void reverse(int arr[], int n) {int start = 0;int end = n - 1;while (start < end) {// 交换int temp = arr[start];arr[start] = arr[end];arr[end] = temp;start++;end--;}
}int main() {int arr[5] = {1, 2, 3, 4, 5};reverse(arr, 5);// 打印反转后的数组for (int i = 0; i < 5; i++) {printf("%d ", arr[i]);}return 0;
}
输出:
5 4 3 2 1
2.5 数组的排序
排序是数组处理中的常见操作,常用的排序算法包括冒泡排序、选择排序和插入排序等。
示例:冒泡排序
#include <stdio.h>void bubble_sort(int arr[], int n) {for (int i = 0; i < n - 1; i++) {for (int j = 0; j < n - 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] = {5, 2, 9, 1, 5};bubble_sort(arr, 5);// 打印排序后的数组for (int i = 0; i < 5; i++) {printf("%d ", arr[i]);}return 0;
}
输出:
1 2 5 5 9
3. 数组与指针
在C语言中,数组名其实是指向数组第一个元素的指针。数组和指针的紧密关系使得我们可以用指针来访问数组中的元素。
3.1 数组与指针的关系
int arr[5] = {1, 2, 3, 4, 5};
printf("%d\n", *arr); // 输出1,等价于 arr[0]
printf("%d\n", *(arr + 1)); // 输出2,等价于 arr[1]
3.2 使用指针遍历数组
指针可以用来遍历数组,下面的代码展示了如何使用指针来访问数组的元素:
#include <stdio.h>int main() {int arr[5] = {1, 2, 3, 4, 5};int *ptr = arr; // ptr 指向数组的第一个元素// 使用指针遍历数组for (int i = 0; i < 5; i++) {printf("%d ", *(ptr + i));}return 0;
}
输出:
1 2 3 4 5
4. 数组的应用实例
4.1 实现矩阵的转置
矩阵的转置是将矩阵的行和列交换,通常在数值计算中非常有用。
#include <stdio.h>#define ROWS 3
#define COLS 3void transpose(int matrix[ROWS][COLS], int result[COLS][ROWS]) {for (int i = 0; i < ROWS; i++) {for (int j = 0; j < COLS; j++) {result[j][i] = matrix[i][j];}}
}int main() {int matrix[3][3] = {{1, 2, 3},{4, 5, 6},{7, 8, 9}};int result[3][3];transpose(matrix, result);printf("Transposed matrix:\n");for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {printf("%d ", result[i][j]);}printf("\n");}return 0;
}
输出:
Transposed matrix:
1 4 7
2 5 8
3 6 9
4.2 实现动态数组
动态数组可以在运行时改变其大小,使用 malloc 或 calloc 分配内存,实现动态管理。
#include <stdio.h>
#include <stdlib.h>int main() {int *arr;int n = 5;// 动态分配内存arr = (int *)malloc(n * sizeof(int));if (arr == NULL) {printf("Memory allocation failed\n");return 1;}// 填充数组for (int i = 0; i < n; i++) {arr[i] = i + 1;}// 打印数组for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}// 释放内存free(arr);return 0;
}
输出:
1 2 3 4 5
5. 总结
C语言中的数组是基础但强大的工具,理解数组的定义、初始化、访问、操作及应用将为编写高效的程序打下坚实的基础。本文详细介绍了数组的基本操作、进阶技巧以及常见的应用实例,帮助你全面理解和掌握C语言中的数组。
相关文章:
C语言数组详解:从基础到进阶的全面解析
在C语言中,数组是一种基本的数据结构,用于存储多个相同类型的数据。数组的引入使得C语言能够高效地存储和操作大量数据。在任何一个C语言程序中,数组都发挥着极其重要的作用。无论是在算法实现、数据存储、还是在复杂程序的设计中,…...
docker的前世今生
docker来自哪里? 从我们运维部署的历史来看,宿主机从最初的物理机到虚拟机,再到docker,一步步演进到现在。技术演进其实是为了解决当前技术的痛点,那我们来看看有哪些痛点以及如何克服痛点的。 物理机 一般来说&…...
python实现施瓦茨-克里斯托费尔【全网首个】根据用户输入推测函数
上代码: from sympy import symbols, integrate, simplify from sympy.plotting import plotn int(input("n:")) if n < 2:print("Error: Must n > 2") i 0 a [] aef [] A [] x, y symbols(x y) z, w symbols(z w)while i < n…...
c语言中的数组(上)
数组的概念 数组是⼀组相同类型元素的集合; 数组中存放的是1个或者多个数据,但是数组元素个数不能为0。 数组中存放的多个数据,类型是相同的。 数组分为⼀维数组和多维数组,多维数组⼀般⽐较多⻅的是⼆维数组。 数组创建 在C语言…...
Unity3D仿星露谷物语开发25之创建时钟界面
1、目标 在时钟界面显示当前时钟信息,同时设置特殊按钮可以快速推进时间用于测试。 2、创建GameClock.cs脚本 在Assets -> Scripts -> TimeSystem目录下创建GameClock.cs脚本。 代码如下: using System.Collections; using System.Collections…...
数据结构测试题1
一、选择题: 1.若长度为n的钱性表采用顺序存储结构,删除它的第i数据元素之前,需要先依次向前移动( )个数据元素。( C ) A .n-i B.ni C.n-i-1 D.n-i1 2.在单链表中,已知q指的结点是p指的结点的直接前驱结点&am…...
android wifi AsyncChannel(WifiManager和WifiP2pManager)
AynscChannel的讲解 [Android]AsyncChannel介绍-CSDN博客 WifiP2pManager里的channel的使用理解 WifiP2pManager.java public void createGroup(Channel c, ActionListener listener) {checkChannel(c);c.mAsyncChannel.sendMessage(CREATE_GROUP, WifiP2pGroup.NETWORK_ID_PE…...
【Image Captioning】DynRefer
DynRefer是由中国科学院大学于2024年提出的用于1种用于区域级多模态任务的模型。DynRefer 通过模拟人类视觉认知过程,显著提升了区域级多模态识别能力。通过引入人眼的动态分辨率机制, 能够以同时完成区域识别、区域属性检测和区域字幕生成任务。 文章链…...
Midjourney基础-常用修饰词+权重的用法大全
用好修饰词很关键 Midjourney要用除了掌握好提示词的写法,按照上一篇《做Midjourney最好图文教程-提示词公式以及高级参数讲解》画面主体 场景氛围 主体行为 构图方式 艺术风格 图像质量。 要画出有质感的内容我们必须要掌握好“修饰词”,这些修饰…...
没有屋檐的房子-023粪堆旁边的舞蹈
爱美是天性,贫苦的农村人也一样,贫苦的时代也一样。 本世纪,广场舞在华夏大地遍地开花,甚至都传到了外面。但是广场舞这种舞蹈形式并不是互联网时代的特产,也不是电声设备日益高级和普及时代的特产,更不是大…...
基于Docker的Kafka分布式集群
目录 1. 说明 2. 服务器规划 3. docker-compose文件 kafka{i}.yaml kafka-ui.yaml 4. kafka-ui配置集群监控 5. 参数表 6. 测试脚本 生产者-异步生产: AsyncKafkaProducer1.py 消费者-异步消费: AsyncKafkaConsumer1.py 7. 参考 1. 说明 创建一个本地开发环境所需的k…...
【博客之星】年度总结:在云影与墨香中探寻成长的足迹
🐇明明跟你说过:个人主页 🔖行路有良友,便是天堂🔖 目录 一、年度回顾 1、创作历程 2、个人成长 3、个人生活与博客事业 二、技术总结 1、赛道选择 2、技术工具 3、实战项目 三、前景与展望 1、云原生未来…...
SpringBoot的Swagger配置
一、Swagger配置 1.添加依赖 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.2</version> </dependency> 2.修改WebMvcConfig Slf4j Configurat…...
machine learning knn算法之使用KNN对鸢尾花数据集进行分类
通过导入必要的scikit-learn导入必要的库,加载给定的数据,划分测试集和训练集之后训练预测和评估即可 具体代码如下: import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split f…...
C语言练习(16)
猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第10天早上想再吃时,见只剩一个桃子了…...
SOAFEE 技术研讨会:汽车软件定义与自动驾驶技术探讨
在本次技术研讨会上,来自汽车与科技领域的专家们围绕汽车软件定义及自动驾驶技术展开了深入交流与探讨。从 SOAFEE 蓝图计划的创新性理念,到 Autoware 开源项目及 Open AD Kit 在实际应用中的探索,再到 Edge Workload Abstraction and Orches…...
R语言学习笔记之开发环境配置
一、概要 整个安装过程及遇到的问题记录 操作步骤备注(包含遇到的问题)1下载安装R语言2下载安装RStudio3离线安装pacman提示需要安装Rtools4安装Rtoolspacman、tidyfst均离线安装完成5加载tidyfst报错 提示需要安装依赖,试错逐步下载并安装…...
多版本并发控制:MVCC的作用和基本原理
多版本并发控制:MVCC的作用和基本原理 1、MVCC简介1.1 快照读与当前读的区别1.1.1 快照读1.1.2 当前读 1.2 数据库的读写问题1.3 MVCC的作用 2、MVCC实现原理之ReadView2.1 什么是ReadView2.2 ReadView的设计思路2.3 MVCC整体操作流程 1、MVCC简介 1.1 快照读与当前…...
ubuntu18.04安装nvm管理本机node和npm
ubuntu18.04安装nvm管理本机node和npm nvm的使用方法1. 安装nvm2. 加载nvm3. 安装执行版本4. 设置默认版本(可选)5. 检查:6. 将配置加入到shell配置文件中(默认已经加入) 如果系统全局的 Node.js 存在,但被 nvm 覆盖了,可以通过禁用或卸载 nvm 恢复到系统…...
【数据结构进阶】红黑树超详解 + 实现(附源码)
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:数据结构 目录 前言 一、红黑树介绍 二、红黑树原理详解 三、红黑树的实现 1. 节点定义 2. 红黑树类型定义及接口声明 3. 红黑树的插入(重点&a…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
