当前位置: 首页 > news >正文

【教程】C++语言基础学习笔记(七)——Array数组

文首标志
写在前面:
如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持!


【C++语言基础学习】系列文章

第一章 《项目与程序结构》
第二章 《数据类型》
第三章 《运算符》
第四章 《流程控制》
第五章 《Vector向量》
第六章 《String字符串》
第七章 《Array数组》
第八章 《函数》
第九章 《指针》
第十章 《结构体》


文章目录

  • 【C++语言基础学习】系列文章
  • 一、一维数组
    • (一)一维数组定义方式
    • (二)一维数组数组名
    • (三)冒泡排序算法
  • 二、二维数组
    • (一)二维数组定义方式
    • (二)二维数组数组名


C++支持数组数据结构,其可以储存一个固定大小的相同类型元素的顺序集合。数组被用来储存一系列数据,但它往往被认为是一系列相同类型的变量。
数组的声明并不是声明一个个单独的变量,比如number0number1、……、number99等,而是声明一个数组变量,比如numbers,然后使用numbers[0]numbers[1]、……、numbers[99]等来代表一个个单独的变量。数组中的特定元素可以通过索引访问。
所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最好的地址对应最后一个元素。

一、一维数组

(一)一维数组定义方式

在C++中要声明一个数组,一般有三种方式。

数据类型 数组名[ 数组长度 ];// 第一种定义方式
数据类型 数组名[ 数组长度 ] = {1,2, ... };// 第二种定义方式
数据类型 数组名[] = {1,2, ... };// 第三种定义方式

以下是简单的示例。

// 第一种
int arr1[3];
arr1[0] = 10;
arr1[1] = 12;
arr1[2] = 17;
// 第二种
int arr2[3] = { 10,12,17 };
// 第三种
int arr3[] = { 10,12,17 };

第一种方式定义了一个数组arr1具有三个元素,然后逐一赋值。值得注意的是数组元素下标的引用是从0开始的。
第二种方式定义数组arr2也具有三个元素,但此方式将三个元素的值直接通过{}分别赋予。而当给元素赋值不完全时(如四个元素赋三个值),按顺序剩下的没有赋值的元素初始化值默认为0,即没有赋值完的元素用0填充。
第三种方式定义的数组arr3不需要定义数组长度,直接初始化各个元素的具体值即可。但也需要注意的是不能不初始化任何元素的值,会导致编译器检测不出这个数组的长度,以至于报错。

(二)一维数组数组名

一维数组的数组名是指数组在内存中存储的起始地址。在C语言中,声明一个一维数组时,可以将一个标识符用作数组名。例如,如果声明一个名为arr的一维整型数组,那么arr就是该数组的数组名。
总结来说,一维数组名称的用途有两个。

  1. 可以统计整个数组在内存中的长度
  2. 可以获取数组在内存中的首地址

统计占用内存的长度也是使用sizeof()来查看。

int arr[3] = { 1,3,5 };
cout << "整个数组占用内存空间为:" << sizeof(arr) << endl;
cout << "每个元素占用内存空间为:" << sizeof(arr[0]) << endl;
cout << "数组中的元素个数为:" << sizeof(arr) / sizeof(arr[0]) << endl;

返回结果如下。

整个数组占用内存空间为:12
每个元素占用内存空间为:4
数组中的元素个数为:3

而获取数组首地址直接输出数组即可。

int arr[3] = { 1,3,5 };
cout << "数组首地址(十六进制)为:" << arr << endl;// 十六进制
cout << "数组首地址(十进制)为:" << (int)arr << endl;// 十进制
cout << "数组中第一个元素地址为:" << &arr[0] << endl;

返回结果如下。

数组首地址(十六进制)为:00000018F958FB28
数组首地址(十进制)为:-111609048
数组中第一个元素地址为:00000018F958FB28

承接上一个示例,如果希望得到十六进制的首地址返回结果,直接输出数组即可;而如果希望得到十进制结果,则需要将数组转换为整型;若希望得知数组内某个元素的首地址,则需要使用取值运算符&来输出。
值得注意的是数组名是常量,不可以进行赋值操作。

(三)冒泡排序算法

冒泡排序是一种简单的排序算法,它通过依次比较相邻的元素并交换它们的位置来将一个数组按照升序或降序排列。冒泡排序的基本思想是,每一轮扫描将相邻的两个元素比较并交换位置,使得最大(或最小)的元素像气泡一样逐渐浮到数组的末尾。
简单来讲就是对数组内的元素实现了从小到大(从大到小)顺序的排列。由于结构简单,使得冒泡排序成为最常用的排序算法。
其规则如下。

  1. 从第一个元素开始,依次比较相邻的两个元素。
  2. 如果前一个元素大于(或小于)后一个元素,则交换它们的位置。
  3. 继续向后比较并交换,直到最后一个元素,这样一轮比较下来,最大(或最小)的元素就会被交换到最后。
  4. 重复执行步骤 1~3,每一轮比较都会确定一个最大(或最小)的元素的位置。
  5. 当没有发生元素交换时,排序结束。

下面是利用冒泡排序算法实现升序序列的示例。

int arr[9] = { 4,2,8,0,5,7,1,3,9 };
cout << "排序前:" << endl;
for (int i = 0; i < 9; i++)
{cout << arr[i] << " ";
}
cout << endl;

首先,定义一个乱序的数组,用循环遍历输出一下此时数组内的排序。
返回结果如下。

排序前:
4 2 8 0 5 7 1 3 9

此时回想冒泡排序算法的原理,可以得知对9个数的排列,从需要比较的第一个数字到最后一个数字其实只有8轮(第8个数字和第9个数字比较即为最后一轮),所以排序总轮数=元素个数-1;而观察可以得知,每轮对比次数=元素个数-排序轮数-1,以此规律设计冒泡排序算法。
全部代码如下。

#include "test.h"
#include <iostream>using namespace std;void test::Test()
{int arr[9] = { 4,2,8,0,5,7,1,3,9 };cout << "排序前:" << endl;for (int i = 0; i < 9; i++){cout << arr[i] << " ";}cout << endl;// 冒泡排序// 总共排序轮数=元素个数-1for (int i = 0; i < 9 - 1; i++){// 内层循环对比=每轮对比次数=元素个数-排序轮数-1for (int j = 0; j < 9 - i - 1; j++){// 如果第一个数字比第二个数字大,则交换两个数字if (arr[j] > arr[j + 1]){// 创建临时变量承载第一个位置上较大的数字int temp = arr[j];// 令第二个位置上较小的数字转移到第一个位置上arr[j] = arr[j + 1];// 令第二个位置取回原本第一个位置上那个较大的数字arr[j + 1] = temp;}}}cout << "排序后:" << endl;for (int i = 0; i < 9; i++){cout << arr[i] << " ";}cout << endl;
}

返回结果如下。

排序前:
4 2 8 0 5 7 1 3 9
排序后:
0 1 2 3 4 5 7 8 9

二、二维数组

C++支持多维数组。在 C++语言中,可以使用多维数组来存储具有多个维度的元素集合。多维数组实际上是数组的数组,每个维度都可以有自己的大小。多维数组声明的一般形式如下。

type name[size1][size2]...[sizeN];

这里主要以二维数组作为示例进行介绍。

(一)二维数组定义方式

在C++中要声明一个二维数组,一般有四种方式。

数据类型 数组名[ 行数 ][ 列数 ];// 第一种定义方式
数据类型 数组名[ 行数 ][ 列数 ] = { { 数据1,数据2 },{ 数据3,数据4 } };// 第二种定义方式
数据类型 数组名[ 行数 ][ 列数 ] = { 数据1,数据2,数据3,数据4 };// 第三种定义方式
数据类型 数组名[][ 列数 ] = { 数据1,数据2,数据3,数据4 };// 第四种定义方式

对于第一种定义方式,test.cpp示例代码如下。

#include "test.h"
#include <iostream>using namespace std;void test::Test()
{// 第一种定义方式int arr1[2][3];arr1[0][0] = 1;arr1[0][1] = 2;arr1[0][2] = 3;arr1[1][0] = 4;arr1[1][1] = 5;arr1[1][2] = 6;// 外层循环打印行数,内层循环打印列数for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){cout << arr1[i][j] << " ";}cout << endl;}
}

按第一种方式,定义一个2行3列的arr1二维数组,并逐个赋值,结果可以用for循环来遍历数组内容。返回结果如下。

1 2 3
4 5 6

对于第二、三、四种定义方法,承接上一个示例,test.cpp代码如下。

// 第二种定义方式
int arr2[2][3] =
{{ 1,2,3 },{ 4,5,6 }
};
// 第三种定义方式
int arr3[2][3] = { 1,2,3,4,5,6 };
// 第四种定义方式
int arr4[][3] = { 1,2,3,4,5,6 };

对于第二种定义方式,行和列的元素赋值明显,通常是最常用也是可读性最强的一种定义方式;而第三种则是在定义了行数和列数后,编译器仍能正确分类每个元素的行数和列数,从而达到预期赋值效果;第四种的原理同第三种定义方式,面对一串元素,在只有两个维度的条件下,即便仅定义了列数,编译器也能从总元素数中得出行数,从而分配赋值。需要注意的是,虽然在定义中可以省略行数,但列数却不可以省略。
代码返回结果和上一个示例相同,故不再展示。

(二)二维数组数组名

与一维数组同理,二维数组数组名也可以查看占用内存空间大小和首地址。

int arr[2][3] =
{{ 1,2,3 },{ 4,5,6 }
};
cout << "二维数组占用内存空间为:" << sizeof(arr) << endl;
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;
cout << "二维数组首地址(十进制)为:" << (int)arr << endl;
cout << "二维数组第一行首地址为:" << (int)arr[0] << endl;
cout << "二维数组第二行首地址为:" << (int)arr[1] << endl;
cout << "二维数组第一个元素首地址为:" << (int)&arr[0][0] << endl;
cout << "二维数组第五个元素首地址为:" << (int)&arr[1][2] << endl;

返回结果如下。

二维数组占用内存空间为:24
二维数组第一行占用内存空间为:12
二维数组第一个元素占用内存空间为:4
二维数组中的行数为:2
二维数组中的列数为:3
二维数组首地址(十进制)为:1781529192
二维数组第一行首地址为:1781529192
二维数组第二行首地址为:1781529204
二维数组第一个元素首地址为:1781529192
二维数组第五个元素首地址为:1781529212

从返回结果来看,二维数组本身、其某一行和某个具体元素之间占用的空间都是成比例的,也就是说每个元素的占用组成了二维数组行列的占用和二维数组本身的占用。对于首地址,值得注意的是二维数组本身的首地址、第一行的首地址、第一个元素的首地址是相同的;而对于第一行和第二行的首地址相差正好是第一行的占用数。


我是EC,一个永远在学习中的探索者,关注我,让我们一起进步!

文末标志

相关文章:

【教程】C++语言基础学习笔记(七)——Array数组

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【C语言基础学习】系列文章 第一章 《项目与程序结构》 第二章 《数据类型》 第三章 《运算符》 第四章 《流程控制》 第五章…...

BUGKU-WEB GET

题目描述 没有提示&#xff0c;就一个get&#xff0c;启动场景看看&#xff1a; 解题思路 显然是PHP语言解读分析代码吧写出你的payload 相关工具 略 解题步骤 进入场景分析代码 $what$_GET[what]; echo $what; if($whatflag) echo flag{****};前两句&#xff1a;使用get…...

蓝桥杯每日一题----唯一分解定理

唯一分解定理 1.内容 任何一个大于1的整数n都可以分解成若干个质数的连乘积&#xff0c;如果不计各个质数的顺序&#xff0c;那么这种分解是惟一的&#xff0c;即若n>1&#xff0c;则有 n ∏ p i j n\prod{p^j_i} n∏pij​ 这里的 p i p_i pi​是质数。可以进行简单证明…...

openssl3.2 - osslsigncode工程的学习

文章目录 openssl3.2 - osslsigncode工程的学习概述笔记工程库地址工程的编译osslsigncodeM工程文件列表osslsigncodeM工程搭建细节原始工程实现的改动自己封装的包含openssl和curl的实现osslsigncodeM工程命令行的用法备注 - VS2019调试环境备注 - 如果要单步openssl的API学学…...

HTML 超文本标记语言

超文本标记语言 HTML 在一个客户程序主窗口上显示出的万维网文档称为页面 (page)。 页面制作的标准语言&#xff1a;HTML。 超文本标记语言 HTML (HyperText Markup Language) 是一种制作万维网页面的标准语言&#xff0c;它消除了不同计算机之间信息交流的障碍&#xff0c…...

sklearn:机器学习 分类特征编码category_encoders

文章目录 category_encoders简介OrdinalEncoder 序列编码OneHotEncoder 独热编码TargetEncoder 目标编码Binary Encoder 二进制编码BaseNEncoder 贝叶斯编码LeaveOneOutEncoder 留一法HashingEncoder 哈希编码CatBoostEncoder catboost目标编码CountEncoder 频率编码WOEEncoder…...

C++错误[错误] call of overloaded ‘min(int, int)‘ is ambiguous

错误代码&#xff1a; #include<iostream> using namespace std;template <class T> T min(T x,T y){if(x<y){return x;}else return y; }int main(){int n12,n210;double d11.5,d25.6;cout<<min(n1,n2)<<endl;cout<<min(d1,d2)<<endl…...

2024全栈元年-thinkphp-数据操作

thinkphp 数据相关操作 1.单数据查询 1、单数据查询 ,Db::table(‘tp_stu’) 必须加前缀 2、如果只是查询符合条件的使用where find,如果没有符合条件的返回null 3、使用 findOrFail 没有数据会抛出异常 4、使用 findOrEmpty 没有数据会返回【】 5、得到最近一个原生SQL …...

HTML世界之第二重天

目录 一、HTML 格式化 1.HTML 文本格式化标签 2.HTML "计算机输出" 标签 3.HTML 引文, 引用, 及标签定义 二、HTML 链接 1.HTML 链接 2.HTML 超链接 3.HTML 链接语法 4.文本链接 5.图像链接 6.锚点链接 7.下载链接 8.Target 属性 9.Id 属性 三、HTML …...

社区经营的好处与优势:为何越来越多的人选择社区店?

社区店&#xff0c;这个曾经被视为小型、局限的商业模式&#xff0c;如今正逐渐崭露头角&#xff0c;成为众多创业者和消费者的首选。 特别是在鲜奶吧这样的细分市场中&#xff0c;社区店更是展现出了其独特的魅力和优势。作为一名拥有五年鲜奶吧经营经验的创业者&#xff0c;…...

C语言系列1——详解C语言:变量、常量与数据类型

目录 写在开始1. 变量与常量的概念1.1. 变量1.2. 常量1.3. 变量与常量的比较1.4. 选择变量还是常量 2. C语言中的基本数据类型2.1. 整型&#xff08;Integer Types&#xff09;2.2. 浮点型&#xff08;Floating-Point Types&#xff09;2.3. 字符型&#xff08;Character Type&…...

WordPress修改所有用户名并发送邮件通知的插件Easy Username Updater

前面跟大家介绍了『如何修改WordPress后台管理员用户名&#xff1f;推荐2种简单方法』一文&#xff0c;但是对于有很多用户的站长来说&#xff0c;操作有点复杂&#xff0c;而且无法发邮件通知对方&#xff0c;所以今天boke112百科向大家推荐一款可以直接在WordPress后台修改所…...

C语言中的数据类型-强转

强制类型转换 概念&#xff1a;将某种类型的数据转化我们需要的数据类型&#xff0c;注意强制类型转化是临时强转&#xff0c;不会改变本身的数据类型。 强转又分为显式强转和隐式转化 显示强转是按照我们的要求进行转化 格式&#xff1a;(需要转化数据类型)变量名 #inclu…...

大数据可视化BI分析工具Apache Superset结合内网穿透实现远程访问

文章目录 前言1. 使用Docker部署Apache Superset1.1 第一步安装docker 、docker compose1.2 克隆superset代码到本地并使用docker compose启动 2. 安装cpolar内网穿透&#xff0c;实现公网访问3. 设置固定连接公网地址 前言 Superset是一款由中国知名科技公司开源的“现代化的…...

C# 线程与线程池的使用方法、注意事项

在C#中&#xff0c;线程和线程池是两种用于实现多线程编程的方式。线程用于执行并发任务&#xff0c;而线程池提供了一种更有效率的方式来管理和复用线程资源。 C# 线程&#xff08;System.Threading.Thread&#xff09; 创建和启动线程&#xff1a; Thread thread new Thre…...

2024年华为OD机试真题-按身高和体重排队-Python-OD统一考试(C卷)

题目描述: :某学校举行运动会,学生们按编号(1、2、3…n)进行标识,现需要按照身高由低到高排列,对身高相同的人,按体重由轻到重排列;对于身高体重都相同的人,维持原有的编号顺序关系。请输出排列后的学生编号。 输入描述:两个序列,每个序列由n个正整数组成(0 < n …...

openGauss学习笔记-218 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-I/O

文章目录 openGauss学习笔记-218 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-I/O218.1 查看I/O状况218.2 性能参数分析 openGauss学习笔记-218 openGauss性能调优-确定性能调优范围-硬件瓶颈点分析-I/O 获取openGauss节点的CPU、内存、I/O和网络资源使用情况&#xf…...

去除vue自带的边距

使用vue时发现总有去不掉的外边距&#xff0c;在index.vue里面怎样设置样式都不管用 查阅资料后发现要在vue项目自带的index.html文件内添加下面的样式代码才行 <style>*{margin: 0;padding: 0;}body,html{margin: 0;padding: 0;} </style>...

ElasticSearch级查询Query DSL上

目录 ES高级查询Query DSL match_all 返回源数据_source 返回指定条数size 分页查询from&size 指定字段排序sort 术语级别查询 Term query术语查询 Terms Query多术语查询 exists query ids query range query范围查询 prefix query前缀查询 wildcard query通…...

120.乐理基础-五线谱-五线谱的多声部与指法问题

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;119.乐理基础-五线谱-五线谱的标记-CSDN博客 五线谱多声部与简谱的多声部一样&#xff1a;简谱的多声部 五线谱多声部例子&#xff1a;钢琴谱 另一个例子&#xff1a;在纵向上有多个音符 然后放大之后&#xff0c…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...