C语言(16)---------->二维数组

news2025/4/4 15:19:15

在学习二维数组之前,掌握一维数组是非常重要的。

对于一维数组的学习,读者可以参考我写过的博客:

C语言(15)-------------->一维数组-CSDN博客

这里面由浅入深地介绍了C语言中一维数组的使用。

一、二维数组的定义

在C语言中,二维数组是一维数组的数组。这句话可能在这里不太好理解,没关系,文章后面会对此进行解释。

由二维数组的定义可知,二维数组的数组就是三维数组 。在C语言中,我们称二维数组以及以上的都称为多维数组。

二、二维数组的创建

二维数组的语法是:

数据类型 数组名[][]

这里的数据类型指的是int float double......即C语言的内置数据类型。 

第一个[]指的是数组的行,第一个[]指的是数组的列。

#include <stdio.h>

int main()
{
	int arr[3][5];//创建一个3行5列的二维数组,数组里面存放的是整数
	return 0;
}

这段代码中的int arr[3][5]指的是3行5列的数组,这个数组里面存的都是整数。

如果我们要定义一个二维数组,它是4行6列的,里面存放的都是字符,如何创建呢?

#include <stdio.h>

int main()
{
	char arr[4][6];//创建一个4行6列的二维数组,数组里面存放的是字符
	return 0;
}

三、二维数组的初始化

二维数组的初始化有4种,不完全初始化、完全初始化、按照行初始化、省略行的初始化。

3.1不完全初始化 

 不完全初始化指的是数组里面的存放的内容小于数组的开辟大小。

举个例子:

#include <stdio.h>

int main()
{
	int arr[4][6] = {1,2,3,4,5,6,7,8,9,10};//元素不够时使用0进行填充
	return 0;
}

二维数组arr是一个4行6列的数组,它可以存放24个数字,而现在我们存放的内容是1到10这10个整数是小于24的,所以这是一个典型的二维数组不完全初始化。

3.2完全初始化

 完全初始化指的是数组里面的存放的内容等于于数组的开辟大小。

举个例子:

#include <stdio.h>

int main()
{
	int arr[3][5] = {1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};
	return 0;
}

 二维数组arr是一个3行5列的数组,它可以存放15个数字,而现在我们存放的内容是15个数字,所以这是一个典型的二维数组完全初始化。

3.3按照行初始化

按照行初始化指的是,我们可以使用{}将我们的数据括起来,{}所包括的内容为1行。而每个{}的内容应该小于我们的列数。

举个例子:

#include <stdio.h>

int main()
{
	int arr[3][5] = { {1,2},{3,4},{5} };
	return 0;
}

3.4省略行的初始化 

在二维数组的定义中,行是可以省略的,但是不可以省略列。

此情况是根据内容确定行数的。

举个例子:

#include <stdio.h>

int main()
{
	int arr[][6] = {1,2,3,4,5,6,7,8,9};
	return 0;
}

对于:

#include <stdio.h>

int main()
{
	int arr[][6] = { 1,2,3 };
	return 0;
}

二维数组中的数字不足6个,实际上只有一行。

下面来看看几个例子:

(1)实际上开辟两行的:

#include <stdio.h>

int main()
{
	int arr[][6] = { 1,2,3,4,5,6,7 };
	return 0;
}

(2)开辟三行的:

#include <stdio.h>

int main()
{
	int arr[][6] = { {1,2},{3,4},{5} };
	return 0;
}

四、二维数组的使用

二维数组在内存中的存储,每一个存储空间都是有编号的。C语言的编号是从0开始的。

#include <stdio.h>

int main()
{
	int arr[3][5] = { {1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15} };
	printf("%d",arr[2][1]);
	return 0;
}

上面这个代码创建并初始化了3行5列的数组,数组每一个空间存储的都是整数。

 红色的表示行的下标,蓝色的表示列的下标。

那上面的代码arr[2][1]指的就是12。

运行结果:

五、在二维数组中输入与输出

 下面我们来一个练习,在二维数组中输入数字,输入完成之后将其打印在屏幕上。

#include <stdio.h>

int main()
{
	int arr[3][5] = { 0 };
	int i = 0;//控制行
	//输入数字
	for (i = 0; i < 3; i++)//确定行数为3
	{
		int j = 0;//控制列
		for (j = 0; j < 5; j++)//确定列数为5
		{
			scanf("%d",&arr[i][j]);
		}
	}
	//打印数字
	for (i = 0; i < 3; i++)//确定行数为3
	{
		int j = 0;//控制列
		for (j = 0; j < 5; j++)//确定列数为5
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");//每一行打印5个数字后换行
	}
	return 0;
}

运行结果:

六、二维数组在内存中的存储

代码:打印二维数组每个元素在内存中的地址

#include <stdio.h>

int main()
{
	int arr[3][5] = { 0 };
	int i = 0;//控制行
	//打印地址
	for (i = 0; i < 3; i++)//确定行数为3
	{
		int j = 0;//控制列
		for (j = 0; j < 5; j++)//确定列数为5
		{
			//注意:取地址时不要忘记使用取地址操作符&
			printf("&arr[%d][%d]=%p\n",i,j,&arr[i][j]);
		}
	}
	return 0;
}

运行结果:(x86)

从结果中,我们可以知道:

二维数组在内存中也是连续存放的。

二维数组可以看成一维数组的数组。

存放一维数组的数组,二维数组中的每个元素都是一维数组。 

 

 七、C99中的变长数组 

在C99之前数组的大小是用常量指定的。

例如:

#include <stdio.h>

int main()
{
	int arr[10];//这里不是变长数组
	return 0;
}

或者:(此处使用的是宏定义,运行代码时M将被替换为100)

#include <stdio.h>
#define M 100

int main()
{
	int arr[M];//这里不是变长数组
	return 0;
}

 在C99之后,引入了变长数组,可以使用变量来指定数组的大小。可惜的是,VS2019不支持这个语法。大家想要尝试这个语法可以在Vscode远程连接Linux服务器的gcc尝试,或者DevC++这种集成gcc编译器的IDE。

参考代码:

#include <stdio.h>

int main()
{
	int num = 0;
	scanf("%d",&num);
	int arr[num];//注意变长数组不能被初始化
	int i = 0;
	//输入数字
	for (i = 0; i < num; i++)
	{
		scanf("%d",&arr[i]);
	}
	//打印数字
	for (i = 0; i < num; i++)
	{
		printf("%d ",arr[i]);
	}
	return 0;
}

 值得一说的是,变长数组是不能初始u啊的,程序运行时根据数组分配来确定实际的大小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2309117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机网络基础】-------计算机网络概念

1.什么是计算机网络 定义&#xff1a; 图解&#xff1a; 2.最简单的计算机网络 其中&#xff1a; 结点可以是计算机、集线器、交换机、路由器等链路可以是有线链路、无线链路 2.1集线器 2.2交换机 3.互连网&#xff08;internet&#xff09;与 路由器 路由器 与 家用路由…

C++实现3D(EasyX)详细教程

一、关于3D 我们看见&#xff0c;这两个三角形是相似的&#xff0c;因此计算很简单 若相对物体的方向是斜的&#xff0c;计算三角函数即可 不会的看代码 二、EasyX简介 initgraph(长,宽) 打开绘图 或initgraph(长,宽…

Centos7部署k8s(单master节点安装)

单master节点部署k8s集群(Centos) 一、安装前准备 1、修改主机名 按照资源准备修改即可 # master01 hostnamectl set-hostname master01 ; bash # node1 hostnamectl set-hostname node1 ; bash # node2 hostnamectl set-hostname node2 ; bash2、修改hosts文件 以下命令所…

【C】链式二叉树算法题1 -- 单值二叉树

leetcode链接https://leetcode.cn/problems/univalued-binary-tree/description/ 1 题目描述 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时&#xff0c;才返回 true&#xff1b;否则返回 false。 示例 1&#xff1…

word转换为pdf后图片失真解决办法、高质量PDF转换方法

1、安装Adobe Acrobat Pro DC 自行安装 2、配置Acrobat PDFMaker &#xff08;1&#xff09;点击word选项卡上的Acrobat插件&#xff0c;&#xff08;2&#xff09;点击“首选项”按钮&#xff0c;&#xff08;3&#xff09;点击“高级配置”按钮&#xff08;4&#xff09;点…

蓝桥杯 灯笼大乱斗【算法赛】

问题描述 元宵佳节&#xff0c;一场别开生面的灯笼大赛热闹非凡。NN 位技艺精湛的灯笼师依次落座&#xff0c;每位师傅都有相应的资历值&#xff0c;其中第 ii 位师傅的资历值为 AiAi​。从左到右&#xff0c;师傅们的资历值逐级递增&#xff08;即 A1<A2<⋯<ANA1​&l…

【多模态大模型学习】位置编码的学习记录

【多模态大模型学习】位置编码的学习记录 0.前言1. sinusoidal编码1.0 数学知识——复数1.0.1 复数乘法、共轭复数1.0.2 复数的指数表示 1.1 sinusoidal编码来历1.2 代码实现 2. Rotary Positional Embedding (RoPE) ——旋转位置编码2.1 RoPE来历2.2 代码实现2.2.1 GPT-J风格的…

vector 面试点总结

ps&#xff1a;部分内容使用“AI”查询 一、入门 1、什么是vector 动态数组容器&#xff0c;支持自动扩容、随机访问和连续内存存储。 2、怎么创建-初始化vector std::vector<int> v; // 创建空vectorstd::vector<int> v {1, 2, 3}; // 直接初始化std::vec…

正式页面开发-登录注册页面

整体路由设计&#xff1a; 登录和注册的切换是切换组件或者是切换内容&#xff08;v-if和 v-else)&#xff0c;因为点击两个之间路径是没有变化的。也就是登录和注册共用同一个路由。登录是独立的一级路由。登录之后进到首页&#xff0c;有三个大模块&#xff1a;文章分类&…

Spring项目-抽奖系统(实操项目-用户管理接口)(END)

^__^ (oo)\______ (__)\ )\/\ ||----w | || || 一&#xff1a;前言&#xff1a; 活动创建及展示博客链接&#xff1a;Spring项目-抽奖系统(实操项目-用户管理接口)(THREE)-CSDN博客 上一次完成了活动的创建和活动的展示&#xff0c;接下来就是重头戏—…

Kafka面试题及原理

1. 消息可靠性&#xff08;不丢失&#xff09; 使用Kafka在消息的收发过程都会出现消息丢失&#xff0c;Kafka分别给出了解决方案 生产者发送消息到Brocker丢失消息在Brocker中存储丢失消费者从Brocker 幂等方案&#xff1a;【分布式锁、数据库锁&#xff08;悲观锁、乐观锁…

CSS—text文本、font字体、列表list、表格table、表单input、下拉菜单select

目录 1.文本 2.字体 3.列表list a.无序列表 b.有序列表 c.定义列表 4.表格table a.内容 b.合并单元格 3.表单input a.input标签 b.单选框 c.上传文件 4.下拉菜单 1.文本 属性描述color设置文本颜色。direction指定文本的方向 / 书写方向。letter-spacing设置字符…

水果识别系统 | BP神经网络水果识别系统,含GUI界面(Matlab)

使用说明 代码下载&#xff1a;BP神经网络水果识别系统&#xff0c;含GUI界面&#xff08;Matlab&#xff09; BP神经网络水果识别系统 一、引言 1.1、研究背景及意义 在当今科技迅速发展的背景下&#xff0c;人工智能技术尤其是在图像识别领域的应用日益广泛。水果识别作为…

40岁开始学Java:Java中单例模式(Singleton Pattern),适用场景有哪些?

在Java中&#xff0c;单例模式&#xff08;Singleton Pattern&#xff09;用于确保一个类只有一个实例&#xff0c;并提供全局访问点。以下是详细的实现方式、适用场景及注意事项&#xff1a; 一、单例模式的实现方式 1. 饿汉式&#xff08;Eager Initialization&#xff09; …

李宏毅机器学习课程学习笔记04 | 浅谈机器学习-宝可梦、数码宝贝分类器

文章目录 案例&#xff1a;宝可梦、数码宝贝分类器第一步&#xff1a;需要定义一个含有未知数的function第二步&#xff1a;loss of a function如何Sample Training Examples > 如何抽样可以得到一个较好的结果如何权衡模型的复杂程度 Tradeoff of Model Complexity todo 这…

Redis详解(实战 + 面试)

目录 Redis 是单线程的&#xff01;为什么 Redis-Key(操作redis的key命令) String 扩展字符串操作命令 数字增长命令 字符串范围range命令 设置过期时间命令 批量设置值 string设置对象,但最好使用hash来存储对象 组合命令getset,先get然后在set Hash hash命令: h…

ISP CIE-XYZ色彩空间

1. 颜色匹配实验 1931年&#xff0c;CIE综合了前人实验数据&#xff0c;统一采用700nm&#xff08;红&#xff09;、546.1nm&#xff08;绿&#xff09;、435.8nm&#xff08;蓝&#xff09;​作为标准三原色波长&#xff0c;绘制了色彩匹配函数&#xff0c;如下图。选定这些波…

【强化学习笔记1】从强化学习的基本概念到近端策略优化(PPO)

好久没有更新了。最近想学习一下强化学习&#xff0c;本系列是李宏毅老师强化学习的课程笔记。 1. Policy-based Model 1.1 Actor 在policy-based model中&#xff0c;主要的目的就是训练一个actor。 对于一个episode&#xff08;例如&#xff0c;玩一局游戏&#xff09;&…

STM32中的ADC

目录 一&#xff1a;什么是ADC 二&#xff1a;ADC的用途 三&#xff1a;STM32F103ZET6的ADC 3.1ADC对应的引脚 3.2ADC时钟 3.3ADC的工作模式 ​编辑3.4ADC校准 3.5ADC转换结构和实际电压的换算 四&#xff1a;ADC配置步骤 五&#xff1a;两个重要的函数 一&#xff1a…

开启AI短剧新纪元!SkyReels-V1/A1双剑合璧!昆仑万维开源首个面向AI短剧的视频生成模型

论文链接&#xff1a;https://arxiv.org/abs/2502.10841 项目链接&#xff1a;https://skyworkai.github.io/skyreels-a1.github.io/ Demo链接&#xff1a;https://www.skyreels.ai/ 开源地址&#xff1a;https://github.com/SkyworkAI/SkyReels-A1 https://github.com/Skywork…