C语言入门,数组知识讲解

发布时间:2026/10/18 8:27:15

C语言入门,数组知识讲解 目录前言1.数组的概念2.一维数组的初始化和创建1.数组创建2.数组的初始化3.数组的类型3.一维数组的使用1.数组下标2.数组元素的打印3.数组的输入4.一维数组在内存中的存储5.sizeof 计算数组元素个数6.二维数组的创建1.二维数组的概念2.二维数组的创建7.二维数组的初始化1.不完全初始化2.完全初始化3.按照行初始化4.初始化时可以省略行不能省略列8.二维数组的使用1.二维数组的下标2.二维数组的输入和输出9.二维数组在内存中的存储10.C99中的变长数组11.练习总结前言数组是C语言中最重要的数据结构之一它让我们能够高效地存储和管理大量同类型数据。无论是简单的数据集合还是复杂的矩阵运算数组都扮演着基础而关键的角色。本文将系统讲解C语言中一维数组和二维数组的核心概念、创建、初始化、使用及内存存储方式并通过实际代码示例帮助您彻底掌握数组的方方面面。1.数组的概念数组是一组相同数据类型的元素构成的集合。数组元素个数不能为0常见的数组是一维数组和多维数组多维数组中二维数组最为常见。2.一维数组的初始化和创建1.数组创建一维数组的语法形式如下type arr_name[常量值];//type表示存放在数组内元素的类型如int、char...还可以是自定义类型//arr_name表示数组的名字取名要有意义//常量值为数组内可以存放元素的个数根据实际情况定例如intmath[20];charinput[5];2.数组的初始化有时候在创建数组时我们需要对数组去初始化一些值。那么怎么初始化数组的值呢数组的初始化一般用花括号将初始值放在括号里面。演示intarr1[5]{1,2,3,4,5};//完全初始化//不完全初始化intarr2[6]{1};//第一个元素初始化为1其余元素默认初始化为0//错误初始化intarr3[3]{1,2,3,4};//初始化的元素个数超过规定元素个数3.数组的类型前面说了数组元素的类型现在来说一下数组的类型去掉数组名留下的类型就是数组的类型演示intarr1[1];//数组类型为 int [1]3.一维数组的使用1.数组下标在C语言中数组内每个元素都有对应的下标相当于元素在数组内的编号下标从0开始。假如数组有n个元素最后一个元素的下标为n-1[ ]为下标引用操作符通过该操作符对数组内任意下标进行访问。如arr1[3]可以对下标为3的元素进行访问根据上图访问结果得到为4。2.数组元素的打印如果想访问整个数组的内容怎么办只需要产生所有元素对印的下标就行通过for循环可以轻松实现。演示#includestdio.hintmain(){intarr[4]{1,2,3,4};inti0;//存储下标的变量//依次将数据打印出来for(i0;i4;i){printf(%d ,arr[i]);}return0;}输出的结果3.数组的输入学习了数组的访问我们也想要自己输入一些数据给数组演示#includestdio.hintmain(){intarr[4]{1,2,3,4};inti0;//存储下标的变量//输入for(i0;i4;i){scanf(%d,arr[i]);//由于输入的是数组内的元素所以要加}//依次将数据打印出来for(i0;i4;i){printf(%d ,arr[i]);}return0;}输出的结果4.一维数组在内存中的存储简单了解完一维数组最好能够深入了解一下一维数组在内存中的存储。依次打印数组内每个元素的地址#includestdio.hintmain(){intarr1[8]{0};//初始化inti0;for(i0;i8;i){printf(arr1[%d]%d\n,i,arr1[i]);}return0;}输出的结果根据输出的结果分析数组下标递增元素地址也随之变大每相邻两个数组元素之间相差4因为一个整型是4个字节得出结论数组在内存中是连续存放的。5.sizeof 计算数组元素个数在C语言中怎么样用程序计算数组内元素个数这里要用到sizeof在之前我们曾经使用sizeof来计算类型或变量大小其实它也可以计算数组的大小。演示#includestdio.hintmain(){intarr1[5]{0};printf(%d\n,sizeof(arr1));//计算数组的总长度printf(%d\n,sizeof(arr1[0]));//数组内元素类型相同计算出一个元素的长度printf(%d\n,sizeof(arr1)/sizeof(arr1[0]));//数组元素个数数组总长度/数组内一个元素的长度return0;}输出的结果单位字节以后写数组内元素个数可以用这个来替代代码更为灵活。6.二维数组的创建1.二维数组的概念在一维数组的基础上将一维数组视为数组内一个元素此时构成的数组就是二维数组。多维数组以此类推如图3个一维数组构成了一个二维数组2.二维数组的创建二维数组语法形式type arr_name[常量1][常量2];例intarr1[3][5]// 3表示数组有3行5表示每一行有5个元素// int表示数组内元素的类型arr1是数组名7.二维数组的初始化1.不完全初始化#includestdio.hintmain(){intarr1[3][5]{1,2};intarr2[3][5]{0};return0;}输出的结果2.完全初始化#includestdio.hintmain(){intarr3[3][5]{1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};return0;}输出的结果3.按照行初始化#includestdio.hintmain(){intarr4[3][5]{{1,2},{3,4},{5,6}};return0;}输出的结果4.初始化时可以省略行不能省略列#includestdio.hintmain(){intarr5[][5]{1,2,3};intarr6[][5]{1,2,3,4,5,6,7};intarr7[][5]{{1,2},{3,4},{5,6}};return0;}输出的结果8.二维数组的使用1.二维数组的下标C语言规定二维数组的行和列都是从0开始的跟在平面直角坐标系上找坐标类似演示#includestdio.hintmain(){intarr3[3][5]{1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};printf(%d\n,arr3[2][4]);return0;}对应数组中第2行第4列arr3[3][5]结果为7。2.二维数组的输入和输出如何访问整个二维数组的内容演示#includestdio.hintmain(){intarr[3][5]{1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};inti0;//二维数组的行intj0;//二维数组的列//输入for(i0;i3;i){for(j0;j5;j){scanf(%d,arr[i][j]);}}//输出for(i0;i3;i){for(j0;j5;j){printf(%d ,arr[i][j]);}printf(\n);}return0;}输出的结果9.二维数组在内存中的存储打印二维数组内每个元素的地址#includestdio.hintmain(){intarr[3][5]{1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};inti0;//二维数组的行intj0;//二维数组的列//输出for(i0;i3;i){for(j0;j5;j){printf(arr[%d][%d]%d\n,i,j,arr[i][j]);}}return0;}输出的结果从输出的结果来看随着二维数组的行和列的递增地址也随之变大相邻的两个元素和跨行的两个元素都相差4个字节得出结论二维数组的每个元素都是连续存放的。如下图所示10.C99中的变长数组我们在创建数组中无法去预测数组的长度有时候数组大了浪费空间有时候数组小了不够用。我们会想能不能使用变量去指定数组大小变长数组的根本特征就是数组长度只有运行时才能确定所以变长数组不能初始化。它的好处是程序员不必在开发时随意为数组指定一个估计的长度程序可以在运行时为数组分配精确的长度。有⼀个比较迷惑的点变长数组的意思是数组的大小是可以使用变量来指定的在程序运行的时候根据变量的大小来指定数组的元素个数而不是说数组的大小是可变的。数组的大小一旦确定就不能再变化了。遗憾的是在VS2022上虽然支持大部分C99的语法没有支持C99中的变长数组没法测试。11.练习练习1多个字符从两端移动向中间汇聚思路参考代码intmain(){chararr1[]{welcome to IT};chararr2[]{*************};intleft0;//左边开始的下标intrightstrlen(arr1)-1;//或者为sizeof(arr1)/sizeof(arr1[0])-2//分别从最左端和最右端开始每次都想中间移动一位并与arr2对应位置置换直到leftright时说明它们已经相遇交错了置换结束while(leftright){Sleep(1000);//睡眠函数将输出过程变得缓慢便于观察变化arr2[left]arr1[left];arr2[right]arr1[right];left;right--;system(cls);//清理屏幕printf(%s\n,arr2);}return0;}//right的计算//以char arr1abcdef为例//法1//strlen计算的在/0前所有字符的个数//strlen(arr1)6,但arr1最大下标为5故最右边下标strlen(arr1)-1;//法2//元素个数sizeof(arr1)/sizeof(arr1[0]);//arr1的元素个数为7包含末尾的/0;故最右边下标sizeof(arr1)/sizeof(arr1[0])-2;练习2给定一个升序的整型数组在这个数组中查找指定的n,找到了就打印n的下标找不到就打印“找不到”思路1逐一对比参考代码#includestdio.hintmain(){intarr1[]{1,2,3,4,5,6,7,8,9};intn7;//在数组内找7inti0;//下标intszsizeof(arr1)/sizeof(arr1[0])-2;//sz表示最右边下标for(i0;isz;i){if(narr1[i]){printf(%d\n,i);break;}}//跳到这里有两种情况//1.break跳出循环n下标找到//2.isz循环结束说明arr1数组内全部都匹配不上输出找不到if(isz)printf(找不到);return0;}思路2二分查找#includestdio.hintmain(){intarr1[]{1,2,3,4,5,6,7,8,9};intn7;//在数组内找匹配7intleft0;//left表示左边下标intrightsizeof(arr1)/sizeof(arr1[0])-2;//right表示最右边下标//n匹配数组内元素的过程要多次进行,不知道具体次数--while循环while(leftright){intmid(leftright)/2;//mid表示左右下标的中间值if(narr1[mid])//n的值在mid下标的右边{leftmid1;//将mid的左边去掉缩小范围,left下标移至mid1处}elseif(narr1[mid])//n的值在mid下标的左边{rightmid-1;//将mid的右边去掉缩小范围right下标移至mid-1处}else//narr1[mid],找到了{printf(%d,mid);break;//找到了跳出循环}}if(leftright)//leftright说明产生交错了但是没有找到。该步判断可以使用布尔运算或状态改变{printf(找不到);}return0;}总结通过本文的学习我们全面掌握了C语言数组的核心知识一维数组理解了数组的基本概念、创建语法、初始化方式完全/不完全初始化、下标访问机制以及如何在内存中连续存储。二维数组掌握了二维数组作为数组的数组的本质学会了创建、初始化包括按行初始化、下标访问和遍历方法。关键特性数组元素在内存中连续存储使用sizeof计算数组元素个数二维数组可以省略行但不能省略列C99中的变长数组特性实践应用通过字符移动汇聚和二分查找等练习将理论知识转化为实际编程能力。数组是C语言编程的基石熟练掌握数组操作将为学习更复杂的数据结构和算法打下坚实基础。建议读者动手实践文中的代码示例加深对数组内存布局和访问机制的理解。
延伸阅读

更多相关文章

2026/10/19 1:03:38

windows 驱动实例分析系列: wireguard-nt驱动分析-api篇(二)

WireGuard-NT API 模块分析 - 第二部分:配置管理、网络接口与日志系统 1. 配置管理 配置管理是 WireGuard 控制平面的核心功能,负责将用户配置(接口密钥、对等点、允许 IP 等)转换为驱动内部数据结构,并支持从驱动查询…

2026/10/18 22:39:24

Claude Skill清单实战指南:从MCP协议到生产化集成

这类工具最值得先看的不是功能列表,而是能不能在普通环境里稳定跑起来,以及它到底解决了什么具体问题。一个在 GitHub 上拥有 7 万星标的 Claude Skill 清单,乍一看是海量技能的集合,但真正有价值的不是这份清单本身,而…

2026/10/15 17:48:26

Virtex-7 FPGA Gen3 Integrated Block for PCI Express v4.3

官方手册笔记 【持续更新中】 Virtex-7系列FPGA第三代PCI Express集成模块内核是一款高带宽、可扩展且高可靠的串行互连基础模块解决方案,适用于全部Virtex-7 XT与HT系列FPGA器件,XC7VX485T型号除外。该PCI Express(PCIe)集成模块方案支持1通道、2通道、4通道以及8通道端点…

2026/10/19 1:05:00

博通WiFi芯片怎么选?从技术优势到供应链验证的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 1:05:00

岗位推荐系统如何用行为信号还原人才本心

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 1:05:00

低成本高精度PWM:4位扩展法实现12位分辨率

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 1:05:00

固态硬盘DRAM缓存越大越好?别再被参数带偏了

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:59:59

IEC 61131标准详解:PLC编程语言、软件模型与实战排查

用IEC 61131这套标准串起PLC编程这件事,是很多工程师绕了远路之后才意识到必须做的事。我见过太多人只会用某个品牌环境的工具栏点来点去,换一个牌子的PLC就抓瞎;也见过有经验的老法师,能把梯形图画得像天书一样漂亮,但…

2026/10/18 0:01:50

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/19 0:04:56

悟空开源无代码平台实战:从实体建模到应用设计避坑指南

简介:基于悟空开源无代码平台的多种应用设计源码,面向希望在不编写代码的情况下快速搭建CRM、HRM、财务系统、ERP、SRM等业务应用的企业与技术人员,通过拖放式界面和内置模板即可完成应用定制与部署。压缩包共697个文件,约10.74MB…

2026/10/19 0:04:56

基于.NET9的多租户权限系统:数据权限与动态API落地实践

简介:这份资源是一套面向 .NET 与 Vue 全栈开发者的中台权限管理系统,后端基于 .Net9,前端采用 Vue3 Element Plus,并配套 uniapp uviewui 移动端方案,实现前后端分离。系统覆盖多租户隔离、数据权限、动态 Api、任务…

2026/10/19 0:04:56

场地预约小程序毕设实战:SSM+微信小程序+MySQL数据库设计到避坑

简介:面向毕业设计场景的场地预约小程序完整项目,基于微信小程序SSMMySql技术栈开发,适合计算机相关专业学生作为选题参考、功能扩展或二次开发起点。系统实现场地类型管理、场地管理、预约管理、取消申请与押金退回等功能,分为管…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑