C语言基础——数组(2)

          ʕ • ᴥ • ʔ         

 づ

 🎉 🎉

个人主页:励志不掉头发的内向程序员;

专栏主页:C语言基础;


文章目录

前言

一、二维数组的创建

1.1 二维数组的概念

1.2二维数组的创建

二、二维数组的初始化

2.1 不完全初始化

2.2 完全初始化

2.3 按照行初始化

三、二维数组的使用

3.1二维数组的下标

3.1二维数组的输入和输出

四、二维数组的内存存储

五、C99中的变长数组

总结


前言

小伙伴们好啊,我们上一章节讲述了一维数组的各种基本语法,明白了一维数组的创建及输入输出以及销毁等,不知道大家有没有想过,数组难道只有一维嘛,有没有更高维,它们又是什么样子的呢,高维数组又有什么作用,那就让我们一起来看看吧。


一、二维数组的创建

1.1 二维数组的概念

我们之前学到了一维数组,数组里面储存的元素是我们计算机的内置类型,而我们把一维数组整体当作一个数组元素,很多个这样的数组的组合就是二维数组,如果我们把二维数组当作一个数组元素同理可得出三维数组,二维数组以上统称为多维数组。

1.2二维数组的创建

我们来看看二维数组的创建方式

type arr_name[常量值1][常量值2];

例如:

int arr[3][5];

char ch[4][3];

如上我们可以总结出以下几点:

1.数据类型,如 int arr[3][5] 的数据类型就是int型,也就是说它里面的各个元素都是int型。

2.我们可以知道arr后面带了两个常量值,这其中的常量值1表示的是有几行,而常量值2则是表示有几列,如我们上面的那张图片就是3行5列的二维数组,所以就是arr[3][5]。

3. 像arr呀,ch呀,都是数组名,是自己所赋予的最好是有意义的名字。

二、二维数组的初始化

我们在创建变量的时候进行赋值叫做初始化,二维数组的初始化和一维数组是相同的,都是用大括号进行初始化。

2.1 不完全初始化

和一维数组类似,但是又不完全相同,二维数组的初始化如果不完全的话,计算机也是会默认没有初始化的部分是为0的,我们可以来观察一下。

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

 这是一个3行5列的二维数组,而且数组类型是int型。

我们可以在监视的地方看到,arr这个二维数组是由三个一维数组组成的,而我们初始化先对二维数组里的第一个一维数组进行初始化,等一维数组的数据满了以后才会对第二个数组进行初始化,如果没有初始化的地方,计算机是默认为0的。那有没有什么办法能给我们二维数组中的第一个一维数组没满的情况下也能在第二个一维数组里输入元素呢,当然可以,我们可以在大括号里面再加一个大括号来区分二维数组和一维数组。

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

如图所示,我们可以在大括号里面再加一个大括号用来表示二维数组的元素,也就是一维数组。

我们可以看到,它们每一个一维数组都不完全初始化了,这就是二维数组的不完全初始化。

2.2 完全初始化

二维数组的完全初始化和一维数组差不多,就是把每个元素都初始化,但是我们可以用大括号来区分不同二维数组的元素。

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

2.3 按照行初始化

按行初始化本质上就是用大括号把二维数组的各个元素,也就是一维数组区分开来,然后再进行初始化,因为一维数组的个数即是行数。

另:我们知道一维数组可以省略数组名后面[ ]里的常量值,可以由计算机来计算常量值应该是多少,二维数组也是同理的,但是它不能两个[ ]里的都省略,它只能省略前面的内容而不能省略后面的内容,也就是它只能省略行而不能省略列,如果都省略掉行,计算机可以通过计算来知道应该有几行,但是如果省略掉列,那计算机就没办法知道一个元素内该赋予多少个值。所以只能省略行而不能省略列。

三、二维数组的使用

我们明白了二维数组的创建方式,那么二维数组该如何使用呢,它的使用方式和一维数组一样吗,我们接下来看看。

3.1二维数组的下标

我们都知道,二维数组是分为行和列的,数组名后面的第一个[]表示的就是行数,第二个[]表示的就是列数,所以说它把里面的每个元素都按行按列给了下表。

我们创建一个这样的三行五列的二维数组,它本质上是这个样子的。

它和一维数组相同,下标都是从0开始到n-1的,像元素1的下标就是0,0,我们想取1出来就让计算机输入arr[0][0]即可。

如果想取这个4,那就是arr[1][2],是先行再列,不是先列再行。

3.1二维数组的输入和输出

我们知道了一维数组的输入和输出主要是运用循环的方式实现的,那二维数组呢?二维数组不就是在一维数组的基础上增加了几行嘛,我们依然可以用循环来实现二维数组。

我们可以使用循环的嵌套,一个循环来控制二维数组的行数,一个循环来控制二维数组的列数,就如图所示,

int main()
{
	//输入
	int arr[3][5] = { 0 };          // 这是一个三行五列的二维数组
	for (int i = 0; i < 3; i++)     //用来控制二维数组的行,遍历一边。
	{
		for (int j = 0; j < 5; j++) //用来控制二维数组的列,遍历一边。
		{
			scanf("%d", &arr[i][j]);
		}
	}
	//当j遍历了一边后i++,这样就实现了遍历二维数组,我们在
	//它每个元素进行输入,这就是二维数组的输入。

	//输出
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

这样我们就实现了二维数组的输入和输出。

四、二维数组的内存存储

我们在表现二维数组的时候是张这个样子的,

 

但是二维数组在内存存储的过程中是什么样子的呢,是不是连续的呢,我们可以来看一下,具体的办法和一维数组相同。我们来看一下它们的地址。

int main()
{
	int arr[3][5] = { 0 };
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			printf("arr[%d][%d] = %p\n", i, j, &arr[i][j]);
		}
	}
	return 0;
}

我们可以看到它们不但每个一维数组内连续的,而且数组之间的内存也是连续的,它在内存中的样子应该是这个样子的,

元素与元素之间在内存上是连续的,和一维数组是一样的。

五、C99中的变长数组

在C99标准前,C语言的在创建时只能用常量或者常量表达式,如

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

int arr[2 + 3] = { 0, 1, 2, 3, 4 };

int arr[ ]= { 0, 1, 2, 3, 4 };

这样的语法限制让我们在创建数组的时候就很不灵活,如果创建大了就浪费空间,如果创建小了那就不够用,所以在C99中就引入了一个变长数组的特性,允许我们可以使用变量来指定数组大小。变长数组只是说我们可以用变量来改变数组,而不是说我们可以让数组任意变长变短。

int main()
{
    n = a + b;
    int arr[n] = { 0 };
    return 0;
}

遗憾的是vs2022虽然引用了很多C99的语法,但是变长数组却没有,所以这里就当了解一下吧。


总结

以上就是数组的全部内容,其实数组的本质是指针,这个我们在指针时再讲,我们接下来就开始来聊聊函数啦,感谢大家的观看,如果有错误请指出,我一定马上更正,谢谢大家。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL中获取时间的方法

大家好&#xff0c;在MySQL数据库开发中&#xff0c;获取时间是一个常见的需求。MySQL提供了多种方法来获取当前日期、时间和时间戳&#xff0c;并且可以对时间进行格式化、计算和转换。 以下是一些常用的MySQL时间函数及其示例&#xff1a; 1、NOW()&#xff1a;用于获取当前…

汇舟问卷:国外问卷调查怎么样?

互联网的发展为我们提供了无数的赚钱机会&#xff0c;其中不乏一些投资小、易上手的小项目&#xff0c;可以让大家充分的利用起业余的时间&#xff0c;赚到日常工作之外的收入。 ​这些项目不仅操作简单&#xff0c;而且时间灵活&#xff0c;非常适合想要利用闲余时间赚外快的…

云渲染农场什么是线程模式?

许多设计师在选择云渲染农场时&#xff0c;常常会遇到48线程、56线程、72线程等选项&#xff0c;然而&#xff0c;不少新手在面对这些选择时&#xff0c;往往无法直观地感受到不同线程数量之间的差异。接下来&#xff0c;我们将共同探讨线程的作用和影响&#xff0c;帮助大家更…

生产制造过程中操作人员引起的不稳定性

获取更多资讯&#xff0c;赶快关注上面的公众号吧&#xff01; 文章目录 工艺成熟度操作成熟度 生产制造过程中&#xff0c;操作人员可能引起一些生产不稳定性&#xff0c;本文将主要介绍两类。 工艺成熟度 以前在工厂做项目时&#xff0c;明明都已经是可全部自动化的高级数…

1347:【例4-8】格子游戏

【解题思路】 该题为判断无向图是否有环。可以使用并查集来完成。学习并查集时&#xff0c;每个元素都由一个整数来表示。而该问题中每个元素是一个坐标点&#xff0c;由(x, y)两个整数构成。 将二维坐标变为一个整数,通过一个公式将二维坐标换算为一个整数&…

如何不用口吐莲花,照样成为社交达人

一、教程描述 每个人的一生&#xff0c;70%的时候都在沟通&#xff0c;与老板沟通、与家人沟通、与朋友沟通、与陌生人沟通&#xff0c;等等&#xff0c;但是你真的会沟通么&#xff1f;不论是工作上跟上司、同事和客户间的沟通&#xff0c;还是生活中与家人、朋友、伴侣间的沟…

B端产品无爆款,说有的都是忽悠和外行!

前言&#xff1a;网上经常有人讲运营&#xff0c;把C端那一套硬搬到B端&#xff0c;讲的自我陶醉&#xff0c;稍微有点常识的人就知道不能这么玩。 一、什么是B端和C端 B端&#xff08;Business-to-Business&#xff09;是指面向企业客户的市场和产品。B端产品或服务主要是为…

kafka命令--简单粗暴有效

zookeeper bin目录下执行 启动&#xff1a;./zkServer.sh start 停止&#xff1a;./zkServer.sh stop 重启&#xff1a;./zkServer.sh restart 状态&#xff1a;./zkServer.sh status kafka bin目录下执行 启动&#xff1a;./kafka-server-start.sh -daemon …/config/server.…

【excel】设置可变下拉菜单(一级联动下拉菜单)

文章目录 【需求】制作动态下拉菜单&#xff0c;显示无重复的“班级”列表【思路】设置辅助列&#xff0c;使用UNIQUE()函数去重&#xff0c;并用FILTER()去掉结果中的“0”【步骤】step1 辅助列step2 设置下拉菜单 【总结】 在这个一级下拉菜单后&#xff0c;我又写了二级联动…

【十年java搬砖路】Jumpserver docker版安装及配置Ldap登陆认证

Jumpserver docker 安装启动教程 拉取镜像 docker pull JumpServer启动进行前确保有Redis 和Mysql 创建jumperServer数据库 在MYSQL上执行 创建数据库 登陆MYSQL mysql -u root -p 创建Jumperserveri库 create database jumpserver default charset utf8mb4;可以为jumperSe…

PTA输入字符串str,识别字符串中字符(0-9A-Za-z),并对识别出的字符串按照按升序进行排序。

输入字符串str&#xff0c;识别字符串中指定范围内的字符(0-9A-Za-z)构成新的字符串str2&#xff0c;对字符串str2按照按升序进行排序。 输入格式: fafOgerPNM-mgg<6254 输出格式: 2456MNOPaeffgggmr #include<stdio.h> #include<string.h> int main() {cha…

SiT : Self-supervised vision Transformer

从NLP Transformer中借鉴而来的视觉 Transformer 在使用大规模监督数据或某种形式的协同监督&#xff08;例如教师网络&#xff09;进行预训练时已被证明是有效的。这些经过监督预训练的视觉Transformer在下游任务中通过最小的改动就能取得出色的结果。 随着监督预训练&#x…

springboot + Vue前后端项目(第十四记)

项目实战第十三记 写在前面1. 建立字典表2. 后端DictController3. Menu.vue4. 建立sys_role_menu中间表5.分配菜单接口6. 前端Role.vue改动总结写在最后 写在前面 本篇主要讲解动态分配菜单第二章节 菜单页面优化 引入图标 角色界面优化 角色自主分配菜单&#xff0c;并保存至…

PTA字符串str1在第i个位置插入字符串str2

字符串str1在第i个位置插入字符串str2&#xff0c;如在字符串1234567890第2位插入ABC。 输入格式: 1234567890 ABC 2 输出格式: 12ABC34567890 #include<stdio.h> #include<string.h> int main() {char s1[100],s2[100];int w;scanf("%s%s%d",s1,s2,…

Docker 基础使用(2) 镜像与容器

文章目录 镜像的含义镜像的构成镜像的作用镜像的指令容器的含义容器的状态容器的指令 Docker 基础使用&#xff08;0&#xff09;基础认识 Docker 基础使用 (1) 使用流程概览 Docker 基础使用&#xff08;2&#xff09; 镜像与容器 Docker 基础使用&#xff08;3&#xff09; 存…

关于stm32的复用和重映射问题

目录 需求IO口的复用和重映射使用复用复用加重映射 总结参考资料 需求 一开始使用stm32c8t6&#xff0c;想实现pwm输出&#xff0c;但是原电路固定在芯片的引脚PB10和PB11上&#xff0c;查看了下引脚的功能&#xff0c;需要使用到复用功能。让改引脚作为定时器PWM的输出IO口。…

tinyrenderer-切线空间法线贴图

法线贴图 法线贴图分两种&#xff0c;一种是模型空间中的&#xff0c;一种是切线空间中的 模型空间中的法线贴图的rgb代表着每个渲染像素法线的xyz&#xff0c;与顶点坐标处于一个空间&#xff0c;图片是五颜六色的。 切线空间中的法线贴图的rgb同样对应xyz&#xff0c;是切线…

排序算法(C++)

参考C算法&#xff0c;这里面有些写法也值得商榷。 1. 冒泡排序算法 冒泡排序算法代码和思路比较简单&#xff0c;大家如果在面试时被要求实现排序时&#xff0c;可以用这种方法来实现。 该算法里&#xff0c;会统一地遍历待排序的数据&#xff0c;每次比较两个相邻的数据&a…

零基础也能学!在RK平台下的OpenHarmony分区镜像烧录

开源鸿蒙硬件方案领跑者 触觉智能 本文适用于在Purple Pi OH开发板进行分区镜像烧录。触觉智能的Purple Pi OH鸿蒙开源主板&#xff0c;是华为Laval官方社区主荐的一款鸿蒙开发主板。 该主板主要针对学生党&#xff0c;极客&#xff0c;工程师&#xff0c;极大降低了开源鸿蒙开…

【Java】设计一个支持敏感数据存储和传输安全的加解密平台

一、问题解析 在一个应用系统运行过程中&#xff0c;需要记录、传输很多数据&#xff0c;这些数据有的是非常敏感的&#xff0c;比如用户姓名、手机号码、密码、甚至信用卡号等等。这些数据如果直接存储在数据库&#xff0c;记录在日志中&#xff0c;或者在公网上传输的话&…