发布时间:2026/8/12 15:50:23
C语言梦开始的地方6:数组 文章目录C语言梦开始的地方6数组一维数组一维数组的创建一维数组初始化一维数组输入与输出sizeof 计算数组元素个数一维数组在内存的存储二维数组二维数组的创建二维数组初始化二维数组输入与输出二维数组计算大小二维数组在内存的存储C99变长数组C语言梦开始的地方6数组数组是一组相同类型元素的集合从这个概念中我们就可以发现2个有价值的信息数组中存放的是1个或者多个数据但是数组元素个数不能为0。数组中存放的多个数据类型是相同的。数组分为一维数组和多维数组多维数组一般比较多见的是二维数组一维数组一维数组的创建一维数组的创建type arr_name[常量值];存放在数组的值被称为数组的元素数组在创建的时候可以指定数组的大小和数组的元素类型。type 指定的是数组中存放数据的类型可以是 char、short、int、float 等也可以自定义的类型。arr_name 指的是数组名的名字这个名字根据实际情况起的有意义就行。[] 中的常量值是用来指定数组的大小的这个数组的大小是根据实际的需求指定就行比如我想统计一下班级上20个同学的名字char name[20];除上述以外我们可以根据不同需求来进行创建不同类型和大小的一维数组double score[20]; int id[20];数组类型算是一种自定义类型去掉数组名留下的就是数组的类型比如说int arr[10]; -》int [10] char arr2[10]; -》char [10] 以此类推bool类型也可以我们给0就是false给1就是true给任何非零值都可以C语言普遍是给1一维数组初始化上述是我们对一维数组的简单了解现在我们开始了解一下一维数组的初始化操作一维数组的初始化操作分完全初始化不完全初始化#includestdio.hintmain(){// 完全初始化intarr1[5]{1,2,3,4,5};// 不完全初始化intarr2[5]{1};//第一个元素初始化为1剩余的元素默认初始化为0return0;}arr1输出是12345arr2输出是10000在初始化数组时一定不要输入超出数组给出的范围大小不然就会越界报错比如int arr3[4] {1,2,3,4,5};这种就会之间报错如果不知道数组范围大小或者没有想清楚我们可以这样来写#defineCAPACITY10intmain(){intarr1[CAPCITY]{1,2,3,4,5,6};// 或者这样intarr2[]{1,2,3,4,5,6};return0;}第一种写法#define CAPACITY 10 是预处理指令以 # 开头。它不参与编译而是在编译之前预处理阶段由预处理器把代码中所有写有 CAPACITY 的地方机械地、原封不动地替换成 10简单了解就是#define在这里就是文本替换第二种写法不给范围让编译器来自己去计算大小这两种写法都可以满足我们在不知道给多少范围时使用第一种会更加灵活因为大了我们直接修改capcity的值即可小了同理。一维数组输入与输出一维数组同样可以进行输入输出操作不过和我们平时输入输出不一样平时的输入 scanf(%d,n); 数组的输入 scanf(%d,arr1[i]);我们需要先知道数组的下标才能进行正常的输入和输出操作但是数组的下标并不是从1开始而是从0开始所以输入和输出都是从0开始一直到数组的结尾部如果一个数组长度为n那么就是要到n - 1处。在C语言中数组的访问提供了一个操作符[] 这个操作符叫下标引用操作符。intmain(){intarr1[10];for(inti0;i10;i){scanf(%d,arr1[i]);}for(inti0;i10;i){printf(arr1[%d]: %d ,i,arr1[i]);}return0;}sizeof 计算数组元素个数当我们不知道数组的个数时此时我们还需要遍历数组时我们就可以通过sizeof来计算他的大小sizeof不仅能计算出类型的大小并且也可以计算数组的大小。sizeof计算的单位是字节intmain(){intarr1[10];intsizesizeof(arr1);printf(%d\n,size);intnsizeof(arr1)/sizeof(arr1[0]);printf(%d\n,n);return0;}这里size是40的原因是一个int类型占4个字节那么n的结果就好理解了 40 / 4 10。一维数组在内存的存储有了前面的知识我们其实使用数组基本没有什么障碍了如果我们要深入了解数组我们最好能了解一下数组在内存中的存储。依次打印数组元素的地址intmain(){intarr1[10]{1,2,3,4,5,6,7,8,9,10};for(inti0;i10;i){printf(arr1[%d]: %p\n,i,arr1[i]);}return0;}从输出的结果我们分析数组随着下标的增长地址是由小到大变化的并且我们发现每两个相邻的元素之间相差4因为一个整型是4个字节。所以我们得出结论数组在内存中是连续存放的。二维数组上述是我们对一维数组的了解现在我们开始了解多维数组多维数组中使用的最多就是二维数组所以我们只需重点了解二维数组即可二维数组的创建二维数组创建的语法格式type arr_name[常量值1][常量值2] 例如 int arr[3][5]; double data[2][8];相比一维数组 int arr[3]; 多了一个[5]那么三维数组就是比二维数组多了一个[]以此类推.上述代码解释3表示数组有3行5表示每一行有5个元素int 表示数组的每个元素是整型类型arr是数组名可以根据自己的需要指定名字二维数组初始化二维数组的初始化和一维数组初始化同样也分完全初始化和不完全初始化不完全初始化 int arr1[3][5] {1,2}; int arr2[3][5] {0}; 完全初始化两种写法 第一种int arr3[3][5] {1,2,3,4,5, 2,3,4,5,6, 1 3,4,5,6,7};还有一种初始化叫按行初始化这种初始化可读性更高并且不完全初始化也可按照按行初始化这样初始化#includestdio.h#includestdio.hintmain(){// 不完全初始化intarr1[3][5]{1,2};intarr2[3][5]{0};// 不完全初始化的按行初始化intarr3[3][5]{{1,2}};// 完全初始化intarr4[3][5]{1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};// 完全初始化的按行初始化intarr5[3][5]{{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}};return0;}二维数组输入与输出同样二维数组的输入输出相比一维也只多了一个[]intmain(){intarr[3][5];inti0;for(i0;i3;i)// 产生行号{intj0;for(j0;j5;j)// 产生列号{scanf(%d,arr[i][j]);// 输入数据}}// 输出for(i0;i3;i)// 产生行号{intj0;for(j0;j5;j)// 产生列号{printf(%d ,arr[i][j]);// 输出数据}printf(\n);}return0;}二维数组计算大小二维数组计算大小的方式和一维数组一样都是通过sizeof关键字来计算的二维数组计算方式如下intmain(){intarr[3][5];introwsizeof(arr)/sizeof(arr[0]);intcolsizeof(arr[0])/sizeof(arr[0][0]);printf(row: %d,col: %d\n,row,col);}sizeof(arr) 60 4 * 154是int类型的所占大小15是arr能存入的范围sizeof(arr[0]) 20 4 * 55是当前行的所存入范围sizeof(arr[0][0]) 4这个等价于一维数组的sizeof(arr[0])只计算了当前元素的所占大小二维数组在内存的存储和处理一维数组一样的打印出二维数组每一个元素的内存地址intmain(){intarr[3][5]{0};inti0;intj0;for(i0;i3;i){for(j0;j5;j){printf(arr[%d][%d] %p\n,i,j,arr[i][j]);}}return0;}从输出的结果来看每一行内部的每个元素都是相邻的地址之间相差4个字节跨行位置处的两个元素如arr[0][4]和arr[1][0]之间也是差4个字节所以二维数组中的每个元素都是连续存放的。所以我们可以得出一个结论二维数组在底层实现上是由多个一维数组组成的因为它的每行的末尾和下一行的开头的地址是连续的。C99变长数组在C99标准之前C语言在创建数组的时候数组大小的指定只能使用常量、常量表达式或者如果我们初始化数据的话可以省略数组大小。这样的语法限制让我们创建数组就不够灵活有时候数组大了浪费空间有时候数组又小了不够用的。C99中给一个变长数组variable-length array简称 VLA的新特性允许我们可以使用变量指定数组大小。变长输出的语法格式是类型 数组名[运行时整型表达式]; 比如 int n a b; int arr[n];需注意的是该语法只能在变长数组语法的编译器上才能使用因为变长数组在有的C语言大佬看来是破坏C语言的一种语法所以有可能当前的编译器支持c99但是不支持c99的变长数组该内容只作了解即可后续我们会了解当更好的方式比如去向堆区申请内存的方式就能完美替代这种语法#includestdio.hintmain(){intn;printf(请输入数组大小: );scanf(%d,n);// 语法使用变量 n 作为长度运行时确定intarr[n];// 填充并打印数组for(inti0;in;i){arr[i]i*10;printf(%d ,arr[i]);}// 输出假设输入50 10 20 30 40return0;}完

相关新闻

2026/8/12 15:50:23

本地LLM幻觉陷阱:从满分错误到RAG防御策略

上周,我本地跑的一个大语言模型(LLM)在某个测试集上拿了满分——6分。听起来是个好消息,对吧?但真相是,它答错了所有6道题。这个结果让我愣了好几秒。一个模型,在评分标准下拿到了最高分&#x…

2026/8/12 15:50:22

stm32 cubemx配置TIM触发ADC采集

一、cubemx配置1.1 配置RCC和SYS1.2 开启USART11.3 配置定时器1.4 配置ADC1.5 配置时钟并生成代码二、代码的编写2.1 printf重定向勾选 Use MicroLIB输入(--no-multibyte-chars)可以防止中文报错2.2 编写main函数/* USER CODE BEGIN PV */uint32_t adc_v…

2026/8/12 15:45:22

基于AI Agent的GitHub与Discord问题自动化处理实践指南

在实际软件开发中,项目维护者常常面临一个共同的痛点:GitHub Issues 和 Discord 社区频道中充斥着大量重复、琐碎或信息不全的问题。手动回复不仅耗时,而且难以保证一致性。SeaTicket 这类 AI Agent 的出现,正是为了解决这一工程效…

2026/8/12 17:05:32

从心形线到动态爱心:C++、Python与HTML/JS多语言实现详解

1. 项目概述:从“李峋同款”到编程入门的浪漫实践最近在社交媒体和编程社区里,“爱心代码”这个话题又火了起来,尤其是和“李峋”这个名字绑定的各种版本。很多刚入门编程的朋友,或者想用一点小创意表达心意的同学,都在…

2026/8/12 17:05:32

Chrome插件开发实战:提升开发者效率的必备工具与工作流

在日常开发和学习中,浏览器是我们最核心的工具之一。然而,原生的谷歌浏览器虽然强大,但在效率提升、信息管理、代码辅助等方面,仍有巨大的优化空间。你是否曾为反复查找某个API文档而烦恼?是否觉得在多个标签页间切换效…

2026/8/12 17:05:32

VMware虚拟机网络故障排查:从原理到实战解决无法上网问题

1. 问题现象与核心影响分析如果你也像我一样,在VMware虚拟机里折腾过网络,大概率都遇到过这个让人头疼的“经典三连”:虚拟机自己内部跑得好好的,但就是ping不通宿主机(也就是你运行VMware的物理电脑)&…

2026/8/12 17:00:32

计算机组成原理核心考点解析:Cache、流水线与复习策略

1. 项目概述:一份“回忆版”试卷的价值与挑战又到了期末季,对于计算机相关专业的学生来说,《计算机组成原理》这门课的分量,大家心里都清楚。它不像某些编程课,靠临阵磨枪写几个Demo就能过关。组成原理考的是你对整个计…

2026/8/12 10:37:12

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/12 5:35:25

当 LLM 遇见大文档:主流开源项目如何处理上下文超限

从 Agentic Loop 到 Repo Map,七种策略与六类陷阱引言:128K vs 10MB 的硬冲突 2026 年的 LLM 上下文窗口已达到 128K ~ 1M token(≈ 0.5MB ~ 4MB 文本),但 LLM 想要处理的真实数据规模远远超过这个量级:真实…

2026/8/12 9:34:08

Ubuntu 23.10中双击运行.sh文件的完整指南:从权限原理到桌面配置

1. 项目概述:从一次“双击”引发的权限探索在Ubuntu桌面环境下,我们习惯了双击运行那些带有.exe后缀的Windows程序安装包,但当你拿到一个以.sh结尾的Shell脚本文件时,满怀期待地双击它,却很可能只看到一个文本编辑器窗…

2026/8/12 9:34:08

NumPy条件索引实战:np.where与np.argwhere高效数据筛选指南

1. 从一次数据筛选的“笨办法”说起 前几天,我帮一个刚入行的数据分析师同事看代码,他正在处理一批传感器数据,需要找出所有温度超过阈值的数据点,然后进行后续分析。我一看他的实现,好家伙,一个 for 循环…

2026/8/12 9:34:08

基于Docker与Selenium Grid构建高可用浏览器自动化测试环境

1. 项目概述:为什么需要容器化的浏览器自动化?在软件开发和测试领域,浏览器自动化早已不是新鲜事。无论是日常的UI回归测试、数据抓取,还是复杂的业务流程模拟,Selenium都是我们绕不开的利器。然而,但凡在团…

2026/8/10 11:20:30

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/11 17:06:59

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/11 3:05:11

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…