[C++基础学习-04]----C++数组详解

前言

        在C++中,数组是一种用来存储相同类型元素的数据结构。一维数组是最简单的数组形式,它由一系列按顺序存储的元素组成。二维数组则是由一维数组构成的数组,可以看作是一堆一维数组堆叠在一起形成的矩阵。

正文

01-数组简介

         一维数组和二维数组是在编程中常用的数据结构,它们具有不同的特点和适用场景。

       1、一维数组

        一维数组是一种线性结构,它由一系列按顺序存储的元素组成;通常用于存储一组相同类型的数据,例如整数、浮点数、字符等;访问速度比较快,通过数组下标即可快速定位和访问特定元素;适用于存储列表、向量、序列等线性数据。

        2、二维数组

        二维数组是一种表格状的结构,它由一维数组组成的数组,用于存储表格数据或矩阵数据;通常用于存储二维结构的数据,例如游戏地图、图像数据、二维表格等;访问方式需要使用两个下标(行和列)来访问元素,适用于表示二维关系的数据;可以看作是一系列一维数组按照特定方式排列组成的数据结构。

        3、作用

        一维数组常用于存储一组相关联的数据,例如存储学生成绩、温度记录、用户ID等。

        二维数组常用于表示二维空间上的数据,例如表示地图、图片、矩阵等。

        一维数组和二维数组在算法实现、数据处理、图形处理、矩阵运算等方面起着重要作用。

        通过合理使用一维数组和二维数组,可以更高效地组织和管理数据,方便进行各种数据处理和分析操作。

02-一维数组定义

         一维数组的定义和具体代码解释如下:

#include<iostream>
using namespace std;int main()
{//数组   数组中每个数据元素都是相同的数据类型//三种表示形式//1、数据类型   数组名[数组长度]//2、数据类型   数组名[数组长度] = {值1、值2、....}//3、数据类型   数组名[ ] = {值1、值2、....}//1、数据类型 数组名[数组长度]int arr[5];//数组名用arr表示,长度为5个,数组下标从0开始//给数组中的元素进行赋值//牢记:数组元素的下标是从0开始索引的arr[0] = 10;arr[1] = 20;arr[2] = 30;arr[3] = 40;arr[4] = 50;//访问数据元素//cout << arr[0] << endl;//cout << arr[1] << endl;//cout << arr[2] << endl;//cout << arr[3] << endl;//cout << arr[4] << endl;//循环方式输出数组中的数据//for (int i = 0; i < 5; i++)//{//	cout << arr[i] << endl;//}//2、数据类型   数组名[数组长度] = {值1、值2、....}//如果定义的数组长度为5个,但是后面赋值少于5个,则其余的自动取0int  arr2[5] = { 10,20,30,40,50 };//for (int j = 0; j < 5; j++)//{//	cout << arr2[j] << endl;//}//3、数据类型   数组名[ ] = {值1、值2、....}int arr3[] = { 10,20,30,40 };for (int j = 0; j < 4; j++){cout << arr3[j] << endl;}system("pause");return 0;
}

03-数组名

         数组名的定义和具体代码解释如下:

#include<iostream>
using namespace std;int main()
{//一维数组名称的用途//1、可以统计整个数组在内存中的长度int arr[5] = { 10,20,30,40,50 };cout << "数组在内存中所占的长度:" << sizeof(arr) << endl;cout << "第一个数据所占内存为:" << sizeof(arr[0]) << endl;cout << "数组中元素的个数为:" << sizeof(arr) / sizeof(arr[0]) << endl;//2、可以查看数组的首地址cout << "数组的首地址为:"<<(int)arr << endl;//加int,可将十六进制强制转换为十进制//也可查看第一个数据的首地址cout << "第一个数据的首地址为:" << (int)&arr[0] << endl;//第一个数据的首地址和数组的首地址是相同的cout << "第二个数据的首地址为:" << (int)&arr[1]<< endl;//数组名是一个常量,不可以再进行赋值操作// 常量不可进行修改,否则会出现表达式不可进行进行修改的左值//arr = 100;会出现报错system("pause");return 0;
}

04-一维数组案例

         一维数组的案例,三只小猪称体重具体代码解释如下:

#include<iostream>
using namespace std;int main()
{//五只小猪比较体重//1、五只小猪的体重放入一个数组中int arr[5] = { 300,350,200,400,250 };//2、先假设一个最大值int max = 0;int max_pig = 0;for (int i = 0; i < 5;i++){//cout << arr[i] << endl;if (arr[i] > max_pig){max_pig = arr[i];}//cout << max_pig << endl;  如果在里面输出的话,不会跳出for循环,前面四个值也会进行输出,并且,不会比较250}cout << max_pig << endl;// 	for (int i = 0; i < 5; i++)
// 	{
// 		if (arr[i] > max)
// 		//如果访问的数组中的元素比我认定的还要大,更新最大值,这是一个简单的算法
// 		{
// 			max = arr[i];	
// 		}
// 	}
// 	//要在循环之外输出最大值
//	cout<<max<<endl;system("pause");return 0;
}

05-一维数组之元素互换位置

         具体代码和解释如下:

#include<iostream>
using namespace std;int main() 
{// 数组逆置// 1、创建数组int arr[5] = { 1,2,3,4,5 };cout << "数组逆置前的顺序: "<<endl;for (int i = 0; i < 5;i++){cout << arr[i] << endl;}// 2、数组逆置开始// 2.1 首先记录起始下表// 2.2 记录结束下表位置// 2.3 起始下表和结束下表的元素进行互换// 2.4 起始位置++,结束位置--// 2.5 循环执行2.1操作,直到起始位置>=结束位置int start = 0;  // 这里应该记录下表,而不应该直接记录数值
//	int temp = arr[start]; //这里就代表了将数组arr的第一个值存在了temp里 int end = sizeof(arr) / sizeof(arr[0]) - 1;  // 这里使用sizeof计算出了数组的总长度,然后将下表赋给end// 做一个while循环操作while(start<end){// 实现元素互换int temp = arr[start];arr[start] = arr[end];arr[end] = temp;// 实现下表更新start++;end--;}// 打印输出互换之后的数据cout << "数组逆置后的顺序:" << endl;for (int j = 0; j < 5;j++){cout << arr[j] << endl;}system("pause");return 0;
}

06-数组案例之冒泡排序

         具体代码和解释以及运行结果如下:

#include <iostream>
using namespace std;void HeadAdjust(int Array[], int k, int len) {int temp = Array[k];// 最好别用哨兵的方法,直接找一个变量存储//这里一开始让i=根节点的左孩子位置,进入循环for (int i = 2 * k; i <= len; i *= 2) {//下面的这个循环就是在做一个元素下坠的操作,首先判断左孩子(i)是否小于右孩子11//若是小于,则i++,此时i指向右孩子,若是大于,不满足,继续指向左孩子if (i < len && Array[i] < Array[i + 1]) { i++; }//这里如果节点大于左孩子或者右孩子,其实这里就比较了一个,因为左孩子和右孩子的比较//在上一步条件语句中已经执行,这里比较之后,如果满足,证明节点值大,直接退出循环即可if (temp >= Array[i]) { break; }//若是不满足,则将孩子与节点位置互换,并且同时k向前移动,占据i的位置//这里如果还没有结束,可以继续循环,此时k又变成了下一个节点,继续上述步骤else { Array[k] = Array[i]; k = i; }}//当i > len时,全部执行完毕,退出循环,此时再将在哨兵位置保存的值赋给Array[k] Array[k] = temp;
}void swap(int &a, int &b) {int temp = a;a = b;b = temp;
}void Heapsort(int Array[], int len) {for (int i = len / 2 - 1; i >= 0; i--) {HeadAdjust(Array, i, len);}//用1en-1是因为对数组来说是从0下标开始计数for (int i = len - 1; i > 0; i--) {swap(Array[i],Array[0]);//如果不封装,直接交换也可以
// 		int temp = Array[i];
// 		Array[i] = Array[0];
// 		Array[0] = temp;HeadAdjust(Array, 0, i - 1);}
}int main()
{int arr[9] = { 4,2,8,0,5,7,1,9,3 };int len = sizeof(arr) / sizeof(arr[0]); cout << "排序前数据:" << endl;for (int i = 0; i < len;i++){cout << arr[i] << " ";}cout << endl;	Heapsort(arr, len);// 排序后结果cout << "排序后数据:" << endl;for (int i = 0; i < len; i++){cout << arr[i] << " ";}cout << endl;system("pause");return 0;}

07-二维数组定义

         具体代码和解释如下:

#include<iostream>
using namespace std;int main() 
{// 二维数组定义方式/*1. 数据类型 数组名[ 行数 ][ 列数 ];2. 数据类型 数组名[ 行数 ][ 列数 ] = { {数据1,数据2 } ,{数据3,数据4 } };3. 数据类型 数组名[ 行数 ][ 列数 ] = { 数据1,数据2,数据3,数据4};4. 数据类型 数组名[ ][ 列数 ] = { 数据1,数据2,数据3,数据4};建议:以上4种定义方式,利用==第二种更加直观,提高代码的可读性*///1. 数据类型 数组名[ 行数 ][ 列数 ];int arr[2][3];// 赋值arr[0][0] = 25; //第0行第1列的数据为25arr[0][1] = 26;arr[0][2] = 27;arr[1][0] = 28;arr[1][1] = 29;arr[1][2] = 30;// 使用嵌套循环进行打印数组// 外层循环打印行数,内层循环打印列数
// 	for (int i = 0; i < 2; i++)
// 	{
// 		for (int j = 0; j < 3;j++)
// 		{
// 			cout << arr[i][j] << endl;
// 		}
// 	}//2. 数据类型 数组名[ 行数 ][ 列数 ] = { {数据1,数据2 } ,{数据3,数据4 } };  推荐int arr2[2][3] = { {1,2,3},{4,5,6} };  // 这样显示更加直观for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){cout << arr2[i][j] << " ";}cout << endl;}//方式3//数据类型 数组名[行数][列数] = { 数据1,数据2 ,数据3,数据4 };int arr3[2][3] = { 1,2,3,4,5,6 };//方式4//数据类型 数组名[][列数] = { 数据1,数据2 ,数据3,数据4 };int arr4[][3] = { 1,2,3,4,5,6 };system("pause");return 0;}

08-二维数组之数组名

         具体代码和解释如下:

#include <iostream>
using namespace std;int main()
{// 二维数组名称的用途// 1、可以查看占用内存空间大小int arr[2][3] = {{1,2,3},{4,5,5}};cout << "二维数组占用内存空间:" << sizeof(arr) << endl;  // 24 6*4cout << "二维数组第一行所占内存:" << sizeof(arr[0]) << endl;   cout << "二维数组第一个元素所占内存:" << sizeof(arr[0][0]) << endl;// 通过总的二维数组所占内存空间,以及每一行所占内存空间,可以计算得到该数组共有多少行cout << "二维数组的总行数:" << sizeof(arr) / sizeof(arr[0]) << endl;// 通过总的二维数组每一行所占内存空间,以及每个元素所占内存空间,可以计算得到该数组每一行有多少个元素cout << "二维数组每一行元素个数或者可以说有多少列:" << sizeof(arr[0]) / sizeof(arr[0][0]) << endl;// 2、二位数组的首地址cout << "二维数组的首地址为:" << (int)arr << endl;cout << "二维数组第一行的首地址为:" << (int)arr[0] << endl;// 当访问具体元素的地址时,一定不要忘记加上取地址的符号cout << "二维数组第一个元素的首地址为:" << (int)&arr[0][0] << endl;cout << "二维数组第二行的首地址为:" << (int)arr[1] << endl;system("pause");return 0;}

09-二维数组案例成绩统计

         具体代码和解释如下:

#include <iostream>
using namespace std;
#include <string>
int main()
{// 二维数组的案例-考试成绩统计int scores[3][3] ={{ 100,100,100 },{ 90, 50, 100 },{ 60, 70,  80}};string names[3] = { "张三","李四","王五" }; //这相当于又定义了一个名字的一维数组// 2、统计每个学生分数总分for (int i = 0; i < 3;i++){int sum = 0;for (int j = 0; j < 3;j++ ){sum += scores[i][j];// cout << num << " ";}cout<< names[i] <<"的总分为:"<<sum<<endl;}system("pause");return 0;}

总结

         一维数组是一列元素的集合,而二维数组是由多行多列元素组成的矩阵。在C++中,使用数组可以方便地存储和处理大量数据,同时可以通过下标访问数组元素来实现对数组的操作和处理。一维数组和二维数组是编程中常用的数据结构,它们具有各自的特点和适用场景,可以帮助程序员有效地处理各种类型的数据。

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

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

相关文章

《QT实用小工具·五十六》自适应界面变化的控件

1、概述 源码放在文章末尾 该项目实现了网格显示多张带文字的图片在界面中自适应布局 特点 跟随窗口大小变换位置&#xff0c;并带移动动画 响应鼠标事件&#xff0c;图片缩放动画 点击水波纹动画 项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #i…

【华为】路由综合实验(OSPF+BGP基础)

【华为】路由综合实验 实验需求拓扑配置AR1AR2AR3AR4AR5PC1PC2 查看通信OSPF邻居OSPF路由表 BGPBGP邻居BGP 路由表 配置文档 实验需求 ① 自行规划IP地址 ② 在区域1里面 启用OSPF ③ 在区域1和区域2 启用BGP&#xff0c;使AR4和AR3成为eBGP&#xff0c;AR4和AR5成为iBGP对等体…

半监督节点分类:标签传播和消息传递

基础概念回顾 传统图机器学习的特征工程——节点层面&#xff0c;连接层面&#xff0c;全图层面 节点层面&#xff1a;信用卡欺诈 连接层面&#xff1a;推荐可能认识的人 全图层面&#xff1a;预测分子结构 半监督节点分类 半监督节点分类&#xff1a;用已知标签节点预测未…

OpenWRT部署Zerotier虚拟局域网实现内网穿透

前言 细心的小伙伴肯定已经发现了&#xff1a;电脑上部署了Zerotier&#xff0c;如果路由器也部署了OpenWRT&#xff0c;那是否能远程访问呢&#xff1f; 答案是肯定的。 OpenWRT部署Zerotier有啥好处&#xff1f; 那好处必须多&#xff0c;其中的一个便是在外远程控制家里…

图像压缩问题

图像压缩问题的bilibil讲解 1.问题引入 首先&#xff0c;图像是由像素组合成的&#xff0c;每个像素都有灰度值&#xff0c;灰度值是体现像素的颜色的。灰度值从0~255&#xff0c;灰度值占用的位数就是像素占用的位数。我们要存储一个图像就要存储它的所有像素。现在的问题是我…

车载电子电器架构 —— 关于bus off汇总

车载电子电器架构 —— 关于bus off汇总 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明…

【uniapp】H5+、APP模拟浏览器环境内部打开网页

前言 今天将智能体嵌入到我的项目中&#xff0c;当作app应用时&#xff0c;发现我使用的webview组件&#xff0c;无论H5怎么登录都是未登录&#xff0c;而APP却可以&#xff0c;于是进行了测试&#xff0c;发现以下几种情况&#xff1a; 方法<a>标签webviewAPP✅✅网页…

spring高级篇(八)

本篇对Spring MVC 的执行流程做一个简单总结 MVC执行流程总结 当浏览器发送一个请求&#xff0c;例如http://localhost:8080/hello&#xff0c;请求到达服务器后&#xff0c;一般会进行如下操作&#xff1a; 1、首先会经过DispatcherServlet&#xff0c;默认映射路径为 /&…

GRU模块:nn.GRU层的输出state与output

在 GRU&#xff08;Gated Recurrent Unit&#xff09;中&#xff0c;output 和 state 都是由 GRU 层的循环计算产生的&#xff0c;它们之间有直接的关系。state 实际上是 output 中最后一个时间步的隐藏状态。 GRU 的基本公式 GRU 的核心计算包括更新门&#xff08;update gat…

用于密集预测任务的通道知识蒸馏——关键字:蒸馏

摘要 https://arxiv.org/pdf/2011.13256 知识蒸馏(KD)已被证明是训练紧凑密集预测模型的简单有效工具。通过从大型教师网络转移而来的额外监督来训练轻量级学生网络。大多数先前的针对密集预测任务的KD变体都在空间域中对学生网络和教师网络的激活图进行对齐,通常是通过在每…

【Linux】进程间通信 - 管道

文章目录 1. 进程间通信介绍1.1 进程间通信目的1.2 进程间通信发展1.3 进程间通信分类 2. 管道2.1 什么是管道2.2 匿名管道2.3 用 fork 来共享管道原理2.4 站在文件描述符角度 - 深入理解管道2.5 站在内核角度 - 管道本质2.6 管道读写规则2.7 管道特点 3. 命名管道3.1 匿名管道…

linux代码实操——信号的使用

信号的基本概念 信号是系统响应某个条件而产生的事件&#xff0c;进程接收到信号会执行相应的操作。 与信号有关的系统调用在“signal.h”头文件中有声明 常见信号的值&#xff0c;及对应的功能说明&#xff1a; 修改信号的响应方式 – signal() 我们来做个小实验: 在键盘上…

推荐书单|提升境界、思维能力

1、《别做正常的傻瓜》 豆瓣评分&#xff1a;8.1 通过揭示人们在日常生活中常见的非理性行为&#xff0c;引导读者认识并克服这些行为&#xff0c;从而做出更明智的决策。 2、《活法》 豆瓣评分&#xff1a;8.1 稻盛和夫分享其人生哲学和经营哲学的著作&#xff0c;强调了正确…

【C++】模板初阶:泛型编程的起点

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

富文本编辑器CKEditor4简单使用-08(段落首行缩进插件 + 处理粘贴 Microsoft Word 中的内容后保持原始内容格式(包括首行缩进))

富文本编辑器CKEditor4简单使用-08&#xff08;段落首行缩进插件 处理粘贴 Microsoft Word 中的内容后保持原始内容格式&#xff08;包括首行缩进&#xff09;&#xff09; 1. 缩进&#xff0c;特殊方式处理——修改原工具栏里的增加缩进量2 缩进&#xff0c;插件处理2.1 下载…

C语言-链表实现贪吃蛇控制台游戏

使用C语言和链表实现贪吃蛇游戏 一、引言 贪吃蛇游戏是一个经典的游戏&#xff0c;它的玩法简单而富有挑战性。在这个博客中&#xff0c;我将分享如何使用C语言和链表数据结构来自主实现贪吃蛇游戏。我会详细介绍游戏的设计思路、编码过程、遇到的问题及解决方案&#xff0c;…

翻译《The Old New Thing》 - Why does the CreateProcess function do autocorrection?

Why does the CreateProcess function do autocorrection? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20050623-03/?p35213 Raymond Chen 在 2005 年 6 月 23 日 为什么 CreateProcess 函数会进行自动更正&#xff1f; 译注&#xff…

13_Scala面向对象编程_伴生对象

文章目录 1.伴生对象1.1 scala的一个性质&#xff0c;scala文件中的类都是公共的&#xff1b;1.2 scala使用object关键字也可以声明对象&#xff1b; 3.关于伴生对象和类4.权限修饰符&#xff0c;scala仅有private;5.伴生对象可以访问伴生类中的私有属性&#xff1b;6.案例7.伴…

世界十大最具影响力人物颜廷利:真正的高人,靠谱的行为

对于真正的‘高人’&#xff0c; 在面对‘狗洞’时&#xff0c; 他们都比较理智&#xff0c; 从来都不趾高气扬&#xff0c; 因为他们晓得&#xff0c; 倘若说不能弯下腰&#xff0c; 并而直立着身子走路的话&#xff0c; 那么&#xff0c; 他们就不是纯粹的‘高人’&#xff0…

1850H-The Third Letter

题目链接&#xff1a;The Third Letter 本道题目就是带权并查集的模板题&#xff0c;但又好久没学忘了&#xff0c;再复习一遍。。。 路径压缩函数模板&#xff1a; int root(int x){if(pre[x]!x){int troot(pre[x]);d[x]d[pre[x]];pre[x]t;}return pre[x]; } 之后就模拟一…