《探索C语言中数组的奥秘(下)》

作者:小龙报日期:2025/10/2


《探索C语言中数组的奥秘(下)》


前言

学习了二维数组,我们已经基本了解了C语言中数组的使用方式,接下来就让我们进入二维数组的学习吧!
在这里插入图片描述

一、二维数组的创建

1.1⼆维数组的概念

⼀维数组的数组的元素都是内置类型的,如果我们把_⼀维数组做为数组的元素这时候就是⼆维数组_,⼆维数组作为数组元素的数组被称为三维数组,⼆维数组以上的数组统称为多维数组。
在这里插入图片描述

1.2二维数组的创建

1语法规则:
2type arr_name[常量值1][常量值2]3例如:
4int arr[3][5];
5double data[2][8];
6

解释:上述代码中出现的信息
• 3表⽰数组有3行
• 5表⽰每一行有5个元素
• int表⽰数组的每个元素是整型类型
• arr是数组名,可以根据自己的需要指定名字
data数组意思基本⼀致。

二、二维数组的初始化

在一维数组的初始化基础上做了一些改变:

2.1不完全初始化

1int arr1[3][5] = {1,2};
2int arr2[3][5] = {0};
3

在这里插入图片描述

2.2完全初始化

1int arr3[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
2

在这里插入图片描述

2.3按照行初始化

1int arr4[3][5] = {{1,2},{3,4},{5,6}};
2

在这里插入图片描述

2.4 初始化时省略行,但是不能省略列

1int arr5[][5] = {1,2,3};
2int arr6[][5] = {1,2,3,4,5,6,7};
3int arr7[][5] = {{1,2}, {3,4}, {5,6}};
4

在这里插入图片描述

三、维数组的使用

3.1 二维数组的下标

⼆维数组访问也是_使⽤下标的形式的,⼆维数组是有行和列的,只要锁定了行和列就能唯⼀锁定_数组中的⼀个元素
注:C语⾔规定,⼆维数组的行是从0开始的,列也是从0开始的
例:

1int arr[3][5] = {1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7};
2

在这里插入图片描述
比如,我们说:第2行,第4列,快速就能定位出7
代码演示:

1#include <stdio.h>
2int main()
3{
4	int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
5	printf("%d\n", arr[2][4]);
6	return 0;
7}
8

运行结果:
在这里插入图片描述

3.2二维数组的输入和输出

只要能够按照⼀定的规律产⽣所有的行和列的数字就行;以上⼀段代码中的arr数组为例,行的选择范围是_0~~2,列的取值范围是0~4,所以我们可以借助循环_实现生成所有的下标
例:

1#include <stdio.h>
2int main()
3{
4	int arr[3][5] = { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7 };
5	int i = 0;//遍历⾏ 
6	//输⼊ 
7	for (i = 0; i < 3; i++) //产⽣⾏号 
8	{
9		int j = 0;
10		for (j = 0; j < 5; j++) //产⽣列号 
11		{
12			scanf("%d", &arr[i][j]); //输⼊数据 
13		}
14	}
15
16	printf("\n");
17
18	//输出 
19	for (i = 0; i < 3; i++) //产⽣⾏号 
20	{
21		int j = 0;
22		for (j = 0; j < 5; j++) //产⽣列号 
23		{
24			printf("%d ", arr[i][j]); //输出数据 
25		}
26		printf("\n");   //打印一行后换行
27	}
28	return 0;
29}
30

运行结果:
在这里插入图片描述

3.3 二维数组在内存中的存储

了解二维数组的内存存储方式对后期学习指针有重大意义希望大家认真学习
在这里插入图片描述
例:

1#include <stdio.h>
2int main()
3{
4	int arr[3][5] = { 0 };
5	int i = 0;
6	int j = 0;
7	for (i = 0; i < 3; i++)
8	{
9		for (j = 0; j < 5; j++)
10		{
11			printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
12		}
13	}
14	return 0;
15}
16

运行结果:
在这里插入图片描述
从结果来看,每⼀行内部的每个元素都是相邻的,地址之间相差4个字节,跨行位置处的两个元素(如:arr[0][4]和arr[1][0])之间也是差4个字节,所以_⼆维数组中的每个元素都是连续存放_的。

如图所示:
在这里插入图片描述

四、C99中的变长数组

在C99标准之前,C语⾔在创建数组的时候,数组大小的指定只能使⽤常量、常量表达式,或者如果我们初始化数据的话,可以省略数组大小。
例:

1int arr1[10];
2int arr2[3+5];
3int arr3[] = {1,2,3};
4

劣势:这样的语法限制,让我们创建数组就不够灵活,有时候数组⼤了浪费空间,有时候数组又小了不够用。
改进:C99中给⼀个变长数组(variable-lengtharray,简称VLA)的新特性,允许我们可以使用变量指定数组大小。
例:

1int n = a+b;
2int arr[n];
3

注:数组 arr 就是变⻓数组,因为它的⻓度取决于变量 n 的值,编译器没法事先确定,只有运⾏时才能知道 n 是多少
注:变⻓数组的根本特征,就是数组长度只有运行时才能确定,所以变长数组不能初始化
例:

1#include <stdio.h>
2int main()
3{
4 int n = 0;
5 scanf("%d", &n);//根据输⼊数值确定数组的⼤⼩ 
6 int arr[n];
7 int i = 0;
8 for (i = 0; i < n; i++)
9 {
10 scanf("%d", &arr[i]);
11 }
12 for (i = 0; i < n; i++)
13 {
14 printf("%d ", arr[i]);
15 }
16 return 0;
17 }
18

运行结果:
在这里插入图片描述

五、数组的练习

接下来让我们继续一鼓作气,完成几道练习吧!

在这里插入图片描述

练习1:多个字符从两端移动,向中间汇聚

大家可以自己敲一遍,不会在来看看笔者的代码

1#include <stdio.h>
2int main()
3{
4	char arr1[] = "welcome to bit...";
5	char arr2[] = "#################";
6
7	int left = 0;
8	int right = strlen(arr1) - 1;
9	printf("%s\n", arr2);
10	while (left <= right)
11	{
12		Sleep(1000);  //暂停程序执行时间
13		arr2[left] = arr1[left];
14		arr2[right] = arr1[right];
15		left++;
16		right--;
17		printf("%s\n", arr2);
18	}
19	return 0;
20}
21

运行结果:
在这里插入图片描述

练习2:二分查找

什么是二分查找:
⽐如我买了⼀双鞋,你好奇问我多少钱,我说不超过300元。你还是好奇,你想知道到底多少,我就让你猜,你会怎么猜?你会1,2,3,4…这样猜吗?显然很慢;⼀般你都会猜中间数字,⽐如:150,然后看⼤了还是⼩了,这就是_⼆分查找,也叫折半查找。_
解:

1#include <stdio.h>
2int main()
3{
4	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
5	int left = 0;
6	int right = sizeof(arr) / sizeof(arr[0]) - 1;
7	int key = 7;//要找的数字 
8	int mid = 0;//记录中间元素的下标 
9	int find = 0;
10	while (left <= right)
11	{
12		mid = (left + right) / 2;
13		if (arr[mid] > key)
14		{
15			right = mid - 1;
16		}
17		else if (arr[mid] < key)
18		{
19			left = mid + 1;
20		}
21		else if (arr[mid] == key)
22		{
23			find = 1;
24			break;
25		}
26	}
27	if (find == 1)
28		printf("找到了,下标是%d\n", mid);
29	else
30		printf("未找到");
31
32	return 0;
33}
34

运行结果:
在这里插入图片描述

六、总结

数组章节的内容就是这些,希望喜欢笔者文章的朋友点点赞点点关注我们下期见,bye。

在这里插入图片描述


《探索C语言中数组的奥秘(下)》》 是转载文章,点击查看原文


相关推荐


【展厅多媒体】解析VR虚拟驾驶实现多场景自由切换
bmcyzs2025/10/2

VR虚拟驾驶技术的场景切换能力,彻底打破了物理展厅的空间局限,为体验者带来前所未有的自由探索感。系统内置丰富的数字场景资源库,涵盖多种精心设计的驾驶情境——从晨光映照的海岸公路,到霓虹流转的未来都市,用户只需通过直观的选单界面,便能轻松切换不同驾驶世界。 为实现流畅自然的体验过渡,模拟驾驶平台着重优化场景加载效率,通过预加载与渲染技术,极大缩短场景切换等待时间,保障体验过程的连贯性与沉浸感。在汽车展厅中,这项功能被灵活运用于展示车辆性能:切换到山地模式可突显SUV的爬坡能力,选用雨天场景则能清晰


AI 赋能 EMS 微电网能效管理平台:构建分布式能源的智能调控中枢
DDC楼宇自控与IBMS集成系统解读10/2/2025

微电网作为分布式能源(光伏、风电、储能)与负荷的局部能源网络,是实现 “双碳” 目标、提升能源利用效率的关键载体。传统能源管理系统(EMS)虽能完成微电网内数据采集、简单调度与监控,但面对微电网 “新能源出力波动大(如光伏受光照影响)、负荷需求动态变化(如工业用电峰谷差)、多能源协同复杂(如光 - 储 - 充联动)” 等特性,逐渐暴露出调度精度低、能效优化不足、故障响应滞后等短板。随着人工智能(AI)技术的深度融入,EMS 微电网能效管理平台正从 “被动监控” 向 “主动预测、智能优化、协同调度” 升级,形


软件工程作业-报告1
朝圣之路10/1/2025

本次作业要求每位同学独立选择并深度阅读一篇近年发表于人工智能领域的顶尖英文学术论文,并撰写一份分析报告。文献研读能力:培养独立检索、阅读并理解前沿英文技术文献的能力。问题拆解能力:从复杂研究中精准提炼其核心动机、待解问题、关键创新与技术路径。批判性思维:评估技术方案有效性,分析实验设计合理性,识别潜在局限与改进方向。技术表达能力:用清晰、结构化的书面语言准确阐述复杂技术思想与研究成果。


Zookeeper 技术详细介绍
new_daimond9/30/2025

Zookeeper是一个开源的分布式协调服务,为分布式应用提供一致性服务。其核心特性包括数据一致性保证和树形结构的数据模型,支持持久节点、临时节点等多种节点类型。主要应用场景涵盖配置管理、服务注册发现、分布式锁和集群管理等。关键实现基于ZAB协议确保数据一致性,并采用Leader-Follower架构。重难点涉及脑裂问题、性能优化和故障处理。部署方式支持单机、集群和Docker,同时提供监控运维能力。Zookeeper在分布式系统中发挥着重要的协调作用,是构建可靠分布式系统的核心组件。


什么是Fork/Join?
karry_k2025/10/3

ForkJoin Fork/Join 是什么? 它是Java7 引入的一个 并行计算框架, 位于 java.util.concurrent 包下 。 主要解决的问题是:把大任务拆分成多个小任务并行执行,然后合并结果。 核心思想:分治法+工作窃取 核心类 ForkJoinPool 一个特殊的线程池,支持“工作窃取”算法。 每个线程都有自己的任务队列,如果某个线程空闲,会去偷别人的任务执行。 RecursiveTask<V> 代表有返回值的任务。 必须重写 prote


Python 的内置函数 all
IMPYLH2025/10/4

Python 内建函数列表 > Python 的内置函数 all all() 是 Python 提供的一个高效工具,它可以快速判断可迭代对象中的所有元素是否都为真值(Truthy)。它的使用非常简单,但结合不同的场景,可以写出非常优雅的代码。 all 的函数原型如下: def all(iterable): ''' 判断可迭代对象内容是否全部为真值 :param iterable: 一个可迭代对象 :return: 如果 iterable 的所有元素均为真值


HBase的自动负载均衡,提升大数据存储性能
AI量化价值投资入门到精通2025/10/6

HBase自动负载均衡:让大数据存储像排队买奶茶一样高效 关键词 HBase、自动负载均衡、Region分布、大数据存储、性能优化、RegionServer、Master 摘要 在大数据存储领域,HBase凭借高可靠性、强一致性和可线性扩展的特性,成为电商订单、用户行为日志、物联网传感器数据等场景的首选。但随着数据量爆炸式增长,一个隐形的“性能杀手”会逐渐浮现——Region分布不均:有的RegionServer(数据节点)扛着100个Region(数据分片)忙得“喘不过气”,有的却只拿


【Ubuntu 20.04升级python3.9后终端打不开的bug】
woshihonghonga2025/10/7

3. 把Python3.9改为Python3首选项     sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 1     sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 2     sudo update-alternatives --config python3     


程序员副业 | 2025年9月复盘
嘟嘟MD2025/10/9

本文首发于公众号:嘟爷创业日记 。 我已经坚持日更600天+,欢迎过来追剧~ 大家好,我是嘟嘟MD,一个10年程序员,现在离职创业,有700天了,我每个月都会写一篇总结复盘,让大家可以近距离看看一个离职程序员都在干什么,今天这篇是九月份的总结,大概2000字,略长,有空的可以翻翻,希望对大家有一丢丢的借鉴作用! 一、月度大事 大家好,九月结束了,忙碌的一个月又结束了,这个月有些事情变化挺大,需要做出取舍。 1:公众号运营+B站视频运营 公众号和B站视频运营还是我的最高优先级,算是我的主业


微硕WSD2018DN22 N沟MOSFET,汽车副驾桌板LED照明负载开关
MOS管-冠华伟业2025/10/10

随着“办公座舱”概念升温,副驾折叠桌板需集成5V/9V USB、LED照明、触控按键等模块,空间被压缩至“毫米级”,却必须满足“零继电器噪音+零待机功耗+1mm高度”三重要求。微硕WINSOK推出DFN2×2-6S N沟MOSFET WSD2018DN22,凭10mΩ低导通电阻与12A峰值电流,为12V平台桌板LED照明提供“芯片级”静音负载开关方案,一键实现“无感”点亮与μA级待机。 一、市场趋势催生器件需求 2025年中国副驾桌板渗透率预计达28%,单车灯节点由1路增至4路,核心痛点:

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0