[C++基础学习]----04-一维数组和二维数组详解

前言

        在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个,则其余的自动取0
	int  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列的数据为25
	arr[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*4
	cout << "二维数组第一行所占内存:" << 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++中,使用数组可以方便地存储和处理大量数据,同时可以通过下标访问数组元素来实现对数组的操作和处理。一维数组和二维数组是编程中常用的数据结构,它们具有各自的特点和适用场景,可以帮助程序员有效地处理各种类型的数据。

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

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

相关文章

计算机毕业设计php自行车在线租赁管理系统-vue+mysql

本系统的开发使获取自行车在线租赁管理系统信息能够更加方便快捷&#xff0c;同时也使自行车在线租赁管理系统管理信息变的更加系统化、有序化。系统界面较友好&#xff0c;易于操作。 自行车在线租赁管理系统&#xff0c;主要的模块包括首页、个人中心、用户管理、会员管理、自…

Unity开发微信小游戏(2)分享

目录 1.概述 2.代码 3.示例 4.个人作品 1.概述 这里我们能做有两件事&#xff1a; 1&#xff09;主动发起分享 2&#xff09;监听右上角分享&#xff08;...按钮&#xff0c;发朋友圈也在这里&#xff09; API&#xff1a;官方文档 2.代码 1&#xff09;主动发起分享&…

RS0102YH8功能和参数介绍及如何计算热耗散

RS0102YH8功能和参数介绍-公司新闻-配芯易-深圳市亚泰盈科电子有限公司 RS0102YH8 是一款电平转换芯片&#xff0c;由润石&#xff08;RUNIC&#xff09;公司生产。以下是关于RS0102YH8的一些功能和参数的介绍&#xff1a; 电平转换功能&#xff1a; RS0102YH8旨在提供电平转换…

ThinkPad X1 Carbon 2018 6th Gen(20KG,20KH)原装出厂Win10系统镜像下载,恢复开箱状态预装OEM系统

lenovo联想ThinkPad X1 6th Gen笔记本电脑(20KG,20KH)原厂Windows10系统重置安装包 链接&#xff1a;https://pan.baidu.com/s/1rrMch_XdYqKsDXOUSBm3WA?pwdwgxz 提取码&#xff1a;wgxz 联想原装W10系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属L…

AutoMQ 系统测试体系揭秘

01 前言 Apache Kafka 有着比较完备的自测体系。除了常规的单元测试和集成测试以外&#xff0c;Apache Kafka 还有着 1000 的“系统集成和性能测试”&#xff08;以下简称系统测试&#xff09;。系统测试会拉起一套真实的 Kafka 集群&#xff0c;并模拟用户使用 Kafka 集群的方…

【C++】学习笔记——vector_1

文章目录 七、vector1. vector的介绍2. vector的使用 未完待续 七、vector vector 1. vector的介绍 学了 string类 后&#xff0c;学习其他容器就非常简单了。 vector 是表示可变大小数组的序列容器。就是高配版数组。用法就是 vector< class T> name 。 2. vector的…

LeetCode 139 —— 单词拆分

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 定义 d p [ i ] dp[i] dp[i] 表示 s [ 0 , i ] s[0, i] s[0,i] 是否可以被字典中出现的单词拼接&#xff0c;那么状态转移方程为&#xff1a; d p [ i ] t r u e &#xff0c;如果存在任意 j ∈ [ 0 , i − 1…

【CTF Reverse】XCTF GFSJ0489 open-source Writeup(C语言+代码审计+十六进制)

open-source 菜鸡学逆向学得头皮发麻&#xff0c;终于它拿到了一段源代码 解法 是一段 c 语言的源程序。 #include <stdio.h> #include <string.h>int main(int argc, char *argv[]) {if (argc ! 4) {printf("what?\n");exit(1);}unsigned int first…

sql注入工具-​sqlmap

介绍&#xff1a; sqlmap是一款开源的自动化SQL注入工具&#xff0c;用于自动化检测和利用Web应用程序中的SQL注入漏洞。它具有强大的参数化查询和自定义注入脚本的功能&#xff0c;可以通过检测和利用SQL注入漏洞来获取数据库的敏感信息&#xff0c;如用户名、密码和其他重要…

MySQL-SQL执行流程及原理

1、SQL执行流程 2、查询流程 查询缓存&#xff1a; MySQL服务器如果在查询缓存中存在该SQL语句&#xff0c;就直接将结果返回给客户端&#xff0c;没有就进入解析器解析阶段。&#xff08;MySQL 8.0 删除该功能&#xff09;解析器&#xff1a;在解析器中对SQL语句进行语法及语…

MySQL常见问题解决和自动化安装脚本

常见问题 MySQL密码正确但无法登录的情况 这种情况一般都是因为缓存&#xff0c;使用mysql -u root -p123456直到成功登陆为止&#xff0c;并且进入之后重新修改密码&#xff0c;多次重复修改密码的命令并且再一次清除缓存后退出。 ALTER USER rootlocalhost IDENTIFIED WIT…

华为Pura70发布,供应链公司进入静默保密期

保密措施&#xff1a;与华为Pura70发布相关的供应链公司在产品发布前后处于静默保密期。这可能是由于华为对于手机供应链的一些信息处于保密状态&#xff0c;尤其是关于麒麟芯片的代工厂商等敏感信息。这种保密措施有助于保持产品的神秘感&#xff0c;调动用户的好奇心&#xf…

Linux中线程管理命令,查看ps和kill实操记录

Linux中线程管理命令&#xff0c;查看ps和kill实操记录 ps命令实例操作参考链接 写的目的是&#xff0c;笔者在服务器的使用中遇到了这个知识点&#xff0c;并且进行学习和使用&#xff0c;希望在这里记录和加深印象&#xff0c;方便以后回忆和其他读者的学习。 具体的情景是&a…

算法数据结构--单调栈

文章目录 介绍单调递增栈单调递减栈图示应用场景 步骤模板Deque用法例题[739. 每日温度](https://leetcode.cn/problems/daily-temperatures/)[496. 下一个更大元素 I](https://leetcode.cn/problems/next-greater-element-i/) 总结 介绍 单调栈是一种特殊的栈数据结构&#x…

快讯! MySQL 8.4.0 LTS 发布(MySQL 第一个长期支持版本)

MySQL 第一个长期支持版本 8.4.0 LTS 发布&#xff0c;社区版下载地址&#xff1a; https://dev.mysql.com/downloads/mysql/ 功能变更 添加或更改的功能 组复制&#xff1a;与组复制相关的两个服务器系统变量的默认值已更改&#xff1a; 系统变量的默认值为 group_replication…

TS学习-泛型基础

目录 1&#xff0c;介绍1&#xff0c;在函数中使用2&#xff0c;在类型别名&#xff0c;接口中使用3&#xff0c;在类中使用 2&#xff0c;泛型约束3&#xff0c;多泛型4&#xff0c;举例实现 Map 1&#xff0c;介绍 泛型相当于是一个类型变量&#xff0c;有时无法预先知道具体…

JavaWeb--1.Servlet

Servlet&#xff08;基础&#xff09; 1、配置依赖&#xff1a; ​ 在pom.xml文件中加入相关依赖 <dependencies><dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>5.0.0&l…

数据结构--栈与队列【您的关注是我创作的动力!】

文章目录 栈什么是栈&#xff1f;栈的具体实现 队列什么是队列&#xff1f;队列的实现 栈 什么是栈&#xff1f; 栈也是顺序表的一种&#xff0c;栈的逻辑实现是先进后出&#xff08;后进先出&#xff09;就跟子弹夹一样。 具体逻辑就是它只允许在固定的一端进行数据的插入与…

eNSP-抓包解析HTTP、FTP、DNS协议

一、环境搭建 1.http服务器搭建 2.FTP服务器搭建 3.DNS服务器搭建 二、抓包 三、http协议 1.HTTP协议&#xff0c;建立在FTP协议之上 2.http请求 3.http响应 请求响应报文参考&#xff1a;https://it-chengzi.blog.csdn.net/article/details/113809803 4.浏览器开发者工具抓包…

C++ 函数 参数与返回值

#一 参数与返回值 回顾文件读数据功能 文件读数据 1函数参数传值调用过程 将函数调用语句中的实参的一份副本传给函数的型材。 简单的值的传递&#xff0c;实参的值没有发生变化。 2 函数参数传值调用过程 传地址调用 将变量的地址传递给函数的形参 形参和实参指向了同…