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…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...