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

C语言:数组详解

C语言数组详解一.数组的基本概念1.基本概念2.主要特性3.基本操作二.数组的创建、初始化与类型1.一维数组的创建2.一维数组的初始化3.数组的类型4.一维数组的常见操作一维数组下标一维数组元素的打印一维数组的输入与输出5.一维数组的内存结构三.多维数组1.基本概念2.二维数组的创建3.二维数组的初始化4.二维数组的常见操作二维数组下标二维数组元素的打印二维数组的输入与输出5.二维数组的内存结构四.实战演练1.多个字符从两端移动向中间汇聚2.二分查找一.数组的基本概念1.基本概念数组是 C 语言中用于存储相同数据类型的多个元素的集合这些元素在内存中占据连续的存储区域。2.主要特性连续存储数组里的元素在内存中是挨着存放的元素在内存中依次排列地址递增这使得通过索引能快速访问任意元素。固定长度一般而言数组在创建时就需要确定其长度而且这个长度后续通常不能改变。相同数据类型数组中的所有元素都必须是同一种数据类型例如整数int、long等或者浮点数float、double等。3.基本操作访问元素借助索引可以直接访问数组中的元素。索引一般从0开始比如ass[0]指的就是第一个元素。修改元素可以通过索引来更新数组中某个位置的元素值例如ass[2] 10。遍历元素能够使用循环像for循环来依次处理数组里的每一个元素。二.数组的创建、初始化与类型1.一维数组的创建一维数组创建的基本语法type ass_name[常量值];类型 数组名其中type指的是数组的类型例如int、char、float等也可以自定义类型ass_name指的是数组的名字可以根据情况取有意义的名字常量值是用来指定数组的大小示例inthuman[200];floathhh[123];2.一维数组的初始化数组在创建时需要给定一定的初始值。//完全初始化intass[6]{1,2,3,4,5,6};//不完全初始化intass[5]{1};//第一个元素初始化为1剩下未初始化元素默认初始化为0//错误的初始化intass[5]{1,2,3,4,5,6};//初始化项太多3.数组的类型去掉数组名留下的就是数组的类型例如intass_aaaa[7];intass_bbbb[11];intass_cccc[98];ass_aaaa数组的类型是int [7]ass_bbbb数组的类型是int [11]ass_cccc数组的类型是int [98]4.一维数组的常见操作一维数组下标数组下标也称为索引是用于访问数组中特定元素的整数值数组下标从 0 开始即第一个元素的下标为 0第二个元素下标为 1依此类推。示例intass[3]{10,20,30};printf(第一个元素: %d\n,arr[0]);//输出: 10printf(第二个元素: %d\n,arr[1]);//输出: 20一维数组元素的打印使用for循环产生0~9的下标然后访问下标即可示例#includestdio.hintmain(){intass[10]{1,2,3,4,5,6,7,8,9,10};for(inti0;i10;i){printf(%d ,ass[i]);//输出1 2 3 4 5 6 7 8 9 10}return0;}一维数组的输入与输出与scanf函数结合实现输入与输出自己想要的数组。示例#includestdio.hintmain(){intass[10]{1,2,3,4,5,6,7,8,9,10};for(inti0;i10;i){scanf(%d,ass[i]);}for(inti0;i10;i){printf(%d ,ass[i]);}return0;}运行结果5.一维数组的内存结构在计算机内存里一维数组是线性存储的也就是说数组的各个元素会依次存放在连续的内存位置中。其内存结构特点1.连续存储数组的所有元素会被存放在一段连续的内存空间里。例如一个包含 5 个整数的数组会按顺序占据 5 个相邻的整数存储单元。2.固定大小在大多数编程语言中数组一旦创建其大小就固定不变了。这意味着数组所占用的内存空间在创建时就已经确定。3.单一数据类型数组的所有元素都必须是同一种数据类型像整数、浮点数或者对象引用等。这保证了每个元素占用的内存空间是一样的。4.访问效率高由于可以直接通过索引计算出元素的内存地址所以数组支持随机访问访问速度很快。示例#includestdio.hintmain(){intass[5]{1,2,3,4,5};for(inti0;i5;i){printf(ass[%d]%p\n,i,ass[i]);}return0;}运行结果由数组基地址后面几个数字可知相邻地址相差4个字节例如ass[0]到ass[1]差4个字节。注意:数组的索引一般是从 0 开始的这和内存地址的偏移量计算方式是相符的。不同编程语言的数组实现方式可能存在差异例如 Python 的列表实际上是动态数组它在底层会维护一个指向元素的指针数组。理解数组的内存结构有助于高效地使用数组避免像越界访问这类内存错误。三.多维数组1.基本概念多维数组是一种将数据组织成多个维度的表格或立方体结构的方式它允许你存储和操作更高维度的数据。定义与维度一维数组线性排列的元素集合如 [1, 2, 3, 4]。二维数组由行和列构成的矩阵类似表格。三维数组可视为 “页面” 的集合每个页面是一个二维数组。更高维度理论上可以有任意维度如四维、五维但实际中很少超过三维。……2.二维数组的创建二维数组创建的基本语法type ass_name[常量值1][常量值2] 类型 数组名 行 列3.二维数组的初始化二维数组的初始化方式与一维数组的初始化大致一样。完全初始化int ass[2][3] {1,2,3, 4,5,6};下标 如ass[0][0]1 01201231456按照行和列初始化int ass[2][3] {{1,2,3},{4,5,6}};下标01201231456不完全初始化int ass[][3] {1364};//二维数组初始化时可以省略行但是不能省略列下标01201361400……0004.二维数组的常见操作二维数组下标二维数组可以看作是由行和列构成的表格。要访问二维数组里的特定元素就需要使用两个下标分别对应元素所在的行和列。基本概念二维数组本质上是数组的数组。以arr[m][n]为例它表示有m行n列的数组。下标行和列的下标一般都是从0开始的。也就是说第一行的下标是0第一列的下标同样是0。元素访问访问二维数组中位于第i行第j列的元素语法格式为arr[i][j]。二维数组元素的打印与一维数组元打印的方式原理同样先使用for产生二维数组各个下标然后访问各个下标。示例#includestdio.hintmain(){// 创建一个 3x4 的二维数组intarr[3][4]{{1,2,3,4},{5,6,7,8},{9,10,11,12}};// 遍历二维数组并打印所有元素printf(二维数组的所有元素:\n);for(inti0;i3;i){for(intj0;j4;j){printf(%d\t,arr[i][j]);}printf(\n);}// 访问并打印第2行第3列的元素printf(第2行第3列的元素是: %d\n,arr[1][2]);return0;}二维数组的输入与输出与scanf函数结合实现输入与输出自己想要的数组。示例intmain(){intr0,c0,rows0,cols0;intass[100][100]{};printf(输入行和列);scanf(%d %d,rows,cols);printf(依次输入二维数组元素\n);for(r0;rrows;r){for(c0;ccols;c){scanf(%d,ass[r][c]);}printf(\n);}for(r0;rrows;r){for(c0;ccols;c){printf(%d\t,ass[r][c]);}printf(\n);}return0;}5.二维数组的内存结构首先让我们先打印一组二维数组的地址由上面程序运行结果可见二维数组中每个元素的内存存放跟一维数组是一样的都是连续存放四.实战演练1.多个字符从两端移动向中间汇聚代码如下#includestdio.hintmain(){chararr1[]welcome to bit...;chararr2[]#################;intleft0;intrightstrlen(arr1)-1;printf(%s\n,arr2);while(leftright){Sleep(1000);//使每个打印时间间隔为1000毫秒arr2[left]arr1[left];arr2[right]arr1[right];left;right--;printf(%s\n,arr2);}return0;}运行结果2.二分查找给定一个升序的整型数组在这个数组中查找到指定的值n找到了就打印n的下标找不到就打印“找不到”。代码如下#includestdio.hintmain(){intarr[]{1,2,3,4,5,6,7,8,9,10};intleft0;intrightsizeof(arr)/sizeof(arr[0])-1;intkey7;//要找的数字intmid0;//记录中间元素的下标intfind0;while(leftright){mid(leftright)/2;if(arr[mid]key){rightmid-1;}elseif(arr[mid]key){leftmid1;}else{find1;break;}}if(1find)printf(找到了,下标是%d\n,mid);elseprintf(找不到\n);return0;}运行结果:学而不思则罔思而不学则殆。

相关文章:

C语言:数组详解

C语言:数组详解一.数组的基本概念1.基本概念2.主要特性3.基本操作二.数组的创建、初始化与类型1.一维数组的创建2.一维数组的初始化3.数组的类型4.一维数组的常见操作一维数组下标一维数组元素的打印一维数组的输入与输出5.一维数组的内存结构三.多维数组1.基本概念…...

虚拟资产金融犯罪治理中公私协同防控体系研究 —— 以韩国 Upbit 与警方合作为例

摘要 在虚拟资产快速普及与金融犯罪手段持续智能化的背景下,语音钓鱼、投资欺诈、洗钱套现等新型犯罪呈现跨境化、技术化、链条化特征,传统单一执法模式存在数据滞后、响应迟缓、技术不足等局限,难以形成有效遏制。2026 年 4 月,韩…...

打造一个产品评论分析AI工具

客户评论是公司可访问的最丰富的产品反馈来源之一。它们揭示了客户在购买后如何实际体验产品,他们喜欢什么,什么让他们沮丧,他们期望什么,以及产品在哪里不足。 这种反馈特别有价值,因为它是自发的。客户自然会谈及对…...

Tsuru日志聚合性能优化:10个提升吞吐量与降低延迟的终极技巧

Tsuru日志聚合性能优化:10个提升吞吐量与降低延迟的终极技巧 【免费下载链接】tsuru Open source and extensible Platform as a Service (PaaS). 项目地址: https://gitcode.com/gh_mirrors/ts/tsuru Tsuru作为开源且可扩展的Platform as a Service (PaaS)平…...

Tessent测试流程文件里的Tcl魔法:用if/else让你的扫描测试配置更灵活

Tessent测试流程文件里的Tcl魔法:用if/else让你的扫描测试配置更灵活 在芯片测试领域,Tessent Shell作为业界领先的测试解决方案,其Test Procedure File(测试流程文件)的灵活运用往往能决定测试效率的高低。今天我们要…...

别再折腾虚拟机了!Win10下用Geth 1.13+搭建以太坊私有链完整指南(含常见报错解决)

Windows原生环境高效搭建以太坊私有链实战手册 如果你正在寻找一份真正能解决实际问题的以太坊私有链搭建指南,这篇文章就是为你准备的。不同于那些只展示理想流程的教程,我们将直面Windows环境下最常见的报错、配置陷阱和性能瓶颈。许多开发者习惯在虚拟…...

如何确保MVP.css样式一致性:完整的自动化测试策略指南

如何确保MVP.css样式一致性:完整的自动化测试策略指南 【免费下载链接】mvp MVP.css — Minimalist classless CSS stylesheet for HTML elements 项目地址: https://gitcode.com/gh_mirrors/mv/mvp MVP.css是一个极简主义的无类CSS样式表,专为HT…...

MVP.css跨浏览器兼容性终极指南:7个实用技巧解决常见问题

MVP.css跨浏览器兼容性终极指南:7个实用技巧解决常见问题 【免费下载链接】mvp MVP.css — Minimalist classless CSS stylesheet for HTML elements 项目地址: https://gitcode.com/gh_mirrors/mv/mvp MVP.css是一款极简主义的无类CSS样式表,专为…...

通义千问2.5-7B省钱部署案例:GGUF量化仅4GB,3060流畅运行

通义千问2.5-7B省钱部署案例:GGUF量化仅4GB,3060流畅运行 用一张RTX 3060显卡,4GB显存就能流畅运行70亿参数的大模型?这不是天方夜谭,而是通义千问2.5-7B带来的真实体验。 1. 为什么选择通义千问2.5-7B? 如…...

PETRV2-BEV训练效果对比展示:nuscenes高精度vs xtreme1泛化挑战

PETRV2-BEV训练效果对比展示:nuscenes高精度vs xtreme1泛化挑战 最近在星图AI算力平台上折腾了一下PETRV2-BEV模型,分别用nuscenes和xtreme1两个数据集做了训练和测试。结果挺有意思的,一个在标准数据集上表现不错,另一个在泛化性…...

终极图像分类指南:从海豚到多类别的机器学习实战

终极图像分类指南:从海豚到多类别的机器学习实战 【免费下载链接】have-fun-with-machine-learning An absolute beginners guide to Machine Learning and Image Classification with Neural Networks 项目地址: https://gitcode.com/gh_mirrors/ha/have-fun-wit…...

MVP.css暗黑模式终极指南:如何完美适配用户偏好与系统设置

MVP.css暗黑模式终极指南:如何完美适配用户偏好与系统设置 【免费下载链接】mvp MVP.css — Minimalist classless CSS stylesheet for HTML elements 项目地址: https://gitcode.com/gh_mirrors/mv/mvp MVP.css是一款极简主义的无类CSS样式表,为…...

如何高效使用XUnity.AutoTranslator:Unity游戏实时翻译的完整实战指南

如何高效使用XUnity.AutoTranslator:Unity游戏实时翻译的完整实战指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 在全球化游戏市场日益繁荣的今天,语言障碍依然是许多玩家体验…...

ESPHome配置避坑指南:从编译到OTA,让你的ESP32-CAM一次点亮不折腾

ESPHome实战避坑手册:ESP32-CAM从编译到OTA的进阶配置策略 第一次接触ESP32-CAM时,我对着闪烁的蓝色LED灯整整调试了六个小时——不是因为硬件故障,而是YAML配置里一个不起眼的frequency参数写错了单位。这种令人抓狂的经历促使我整理了这份实…...

Tsuru容器网络终极性能测试指南:7大CNI插件深度对比与优化策略

Tsuru容器网络终极性能测试指南:7大CNI插件深度对比与优化策略 【免费下载链接】tsuru Open source and extensible Platform as a Service (PaaS). 项目地址: https://gitcode.com/gh_mirrors/ts/tsuru Tsuru作为开源可扩展的PaaS平台,其容器网络…...

如何实现重组抗体的精准定制?

一、重组抗体定制与传统抗体制备有何本质区别?重组抗体定制是通过基因工程技术在体外构建并表达目标抗体的创新方法。与传统杂交瘤技术相比,重组抗体技术具有多方面的显著优势。首先,其生产完全不依赖于动物免疫系统,而是通过人工…...

5分钟搞定HeyGem数字人视频生成:科哥二次开发版,批量处理指南

5分钟搞定HeyGem数字人视频生成:科哥二次开发版,批量处理指南 1. 系统简介与核心价值 HeyGem数字人视频生成系统批量版是科哥基于原版进行的二次开发版本,专门针对企业级批量视频生成需求进行了优化。这个工具能够将一段音频与多个视频素材…...

Taskwarrior完整国际化指南:如何实现多语言任务管理

Taskwarrior完整国际化指南:如何实现多语言任务管理 【免费下载链接】taskwarrior Taskwarrior - Command line Task Management 项目地址: https://gitcode.com/gh_mirrors/ta/taskwarrior Taskwarrior是一款功能强大的命令行任务管理工具,支持完…...

终极指南:如何实现gumbo-parser跨编译器开发,统一代码风格与宏定义

终极指南:如何实现gumbo-parser跨编译器开发,统一代码风格与宏定义 【免费下载链接】gumbo-parser An HTML5 parsing library in pure C99 项目地址: https://gitcode.com/gh_mirrors/gum/gumbo-parser Gumbo-Parser 是一款纯C99实现的HTML5解析库…...

告别重复造轮子:用快马一键生成可扩展的高效ibbot开发框架

最近在开发一个智能对话机器人(ibbot)时,发现每次从零开始搭建框架都要重复处理很多基础工作。经过一番探索,我发现用InsCode(快马)平台可以快速生成可扩展的项目框架,效率提升非常明显。下面分享下我的实践心得&#…...

Tsuru高可用部署终极指南:构建零单点故障的企业级PaaS平台

Tsuru高可用部署终极指南:构建零单点故障的企业级PaaS平台 【免费下载链接】tsuru Open source and extensible Platform as a Service (PaaS). 项目地址: https://gitcode.com/gh_mirrors/ts/tsuru Tsuru是一个开源且可扩展的平台即服务(PaaS&am…...

rabbitmq新手福音,快马ai生成带详解注释的入门代码,轻松理解消息队列

RabbitMQ新手入门:从零开始理解消息队列 最近在学习消息队列技术,发现RabbitMQ作为最流行的开源消息代理之一,对于新手来说概念确实有点抽象。不过通过InsCode(快马)平台的帮助,我很快就能上手实践了。下面分享我的学习过程&…...

GPCC数据不止看趋势:手把手教你用MATLAB做降水信号的谐波分析(附周年振幅相位代码)

GPCC数据不止看趋势:手把手教你用MATLAB做降水信号的谐波分析(附周年振幅相位代码) 长江流域的降水变化对农业生产、水资源管理和生态保护都具有重要意义。当我们拿到GPCC的月尺度降水数据时,除了绘制时间序列图观察趋势外&#x…...

如何快速提升技术文档专业度:Obsidian代码美化插件终极指南

如何快速提升技术文档专业度:Obsidian代码美化插件终极指南 【免费下载链接】obsidian-better-codeblock Add title, line number to Obsidian code block 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-better-codeblock 还在为技术笔记中单调乏味…...

LTspice AC分析实战:从OP07数据手册曲线到仿真波特图,一步步验证GBW和开环增益

LTspice AC分析实战:从OP07数据手册曲线到仿真波特图,一步步验证GBW和开环增益 在模拟电路设计中,运算放大器的频率响应特性是决定电路性能的关键因素之一。对于刚接触模拟电路设计的工程师或实习生来说,如何将数据手册上的理论参…...

Dunst未来发展方向:探索轻量级通知守护进程的创新路线图

Dunst未来发展方向:探索轻量级通知守护进程的创新路线图 【免费下载链接】dunst Lightweight and customizable notification daemon 项目地址: https://gitcode.com/gh_mirrors/du/dunst Dunst作为一款轻量级且高度可定制的通知守护进程,始终致力…...

从NVIDIA到昇腾:在JupyterLab里统一监控多品牌AI加速卡的实战记录

从NVIDIA到昇腾:在JupyterLab里统一监控多品牌AI加速卡的实战记录 当AI开发团队面临异构计算环境时,如何在一个统一的开发界面中监控不同品牌的加速卡性能,成为提升研发效率的关键痛点。本文将分享我们在JupyterLab中同时监控NVIDIA GPU和华为…...

OpenClaw技能开发入门:为Phi-3-vision制作商品截图分析插件

OpenClaw技能开发入门:为Phi-3-vision制作商品截图分析插件 1. 为什么需要商品截图分析技能 上周我在整理双十一购物清单时,发现手动对比不同平台的商品价格和促销信息简直是一场噩梦。每次都要反复截图、整理、记录,效率低下还容易出错。这…...

【2024最严苛压测实录】:FastAPI 2.0 + LLM流式响应如何在16K并发下保持P99<120ms?6项核心参数调优清单限时公开

第一章:FastAPI 2.0 异步 AI 流式响应性能调优全景图FastAPI 2.0 原生强化了对异步流式响应(StreamingResponse)的底层支持,尤其在大模型推理场景中,结合 async generator 与 httpx.AsyncClient 可实现端到端零拷贝流式…...

揭秘量子比特态演化模拟:用现代C++20实现HHL算法,内存开销降低73%的关键技巧

第一章:量子比特态演化模拟的理论基础与工程挑战 量子比特态演化模拟是连接量子力学原理与可执行计算任务的核心桥梁。其理论根基植根于薛定谔方程的幺正演化描述:任意闭合量子系统的时间演化由哈密顿量 $H(t)$ 决定,满足 $|\psi(t)\rangle …...