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

C++ 数组

数组是具有一定顺序关系的若干对象的集合体,组成数组的对象称为该数组的元素。 数组元素用数组名与带方括号的下标表示,同一数组的各个元素具有相同的类型。数组可以由除void型以外的任何一种类型构成,构成数组的类型和数组之间的关系,可以类比为数学上数与向量或矩阵的关系。

每个元素有n个下标的数组称为n维数组。如果用array来命名一个数组,且其下标为从0到N的整数,则数组各元素为array[0],array[1],…,array[N]。这样一个数组可以顺序存储N+1个数据,因此N+1就是数组array的大小,数组的下标下界为0,数组的下标上界为N。

1.数组的声明与使用

(1)数组的声明

数组属于自定义数据类型,因此在使用之前首先要进行类型声明。声明一个数组类型,应该包括以下几个方面:

①确定数组的名称
②确定数组元素的类型
③确定数组的结构(包括数组维数,每一维的大小等)

数组类型声明的一般形式为:

数据类型 标识符[常量表达式1][常量表达式2]...;

数组中元素的类型是由“数据类型”给出,这个数据类型,可以是整型、浮点型等基本类型,也可以是结构体、类等用户自定义类型。数组的名称由“标识符”指定。

“常量表达式1”、“常量表达式2”、…称为数组的界,必须是在编译时就可求出的常量表达式,其值必须为正整数。数组的下标用来限定数组的元素个数、排列次序和每一个元素在数组中的位置。一个数组可以有多个下标,有n个下标的数组称为n维数组,数组元素的下标个数称为数组的维数。声明数组时,每一个下标表达式表示该维的下标个数(注意:不是下标上界)。数组元素个数是各下标表达式的乘积。例如:

int b[10];

表示b为int型数组,有10个元素:b[0]~b[9],可以用于存放10个元素的整数序列。

int a[5][3];

表示a为int型二维数组,其中第一维有5个下标(0~4),第二维有3个下标(0~2),数组元素的个数为15,可以用于存放5行3列的整型数据表格。值得注意的是数组下标的起始值为0。对于上面声明的数组a,第一个元素是a[0][0],最后一个元素是a[4][2]。也就是说每一维的下标都是从0开始。

(2)数组的使用

使用数组时,只能分别对数组的各个元素进行操作。数组的元素是由下标来区分的。对于一个已经声明过的数组,其元素的使用形式为:

数组名[下标表达式1][下标表达式2]...

其中下标表达式个数取决于数组的维数,N维数组就有N个下标表达式。

数组中的每一个元素都相当于一个相应类型的变量,凡是允许使用该类型变量的地方,都可以使用数组元素。可以像使用一个整型变量一样使用整型数组的每一个元素。同样,每一个类类型的数组也可以和一个该类的普通对象一样使用。在使用过程中注意以下两点:

(1)数组元素的下标表达式可以是任意合法的算术表达式,其结果必须为整数。
(2)数组元素的下标值不得超过声明时所确定的上下界,否则运算时数组越界错误。

【例】数组的声明与使用

#include<iostream>
using namespace std;int main()
{int a[10], b[10];for (int i = 0; i < 10; i++){a[i] = i * 2 - 1;b[10 - i - 1] = a[i];}for (int i = 0; i < 10; i++){cout << "a[" << i << "]=" << a[i] << endl;cout << "b[" << i << "]=" << b[i] << endl;}return 0;
}

运行结果:
在这里插入图片描述
结果分析:
程序中,定义了两个有10个元素的一维数组a和b,使用for循环对它们赋值,在引用b元素时采用了算术表达式作为下标。程序运行之后将-1,1,3,…,17分别赋给数组元素a[0],a[1],…,a[9],数组b中元素的值刚好是数组a中的逆序排列。

如果把两个循环语句for(int i=0;i<10;i++)改写为for(int i=1;i<=10;i++),在编译和连接过程中都不会出错,但最后运行时不仅不会得到正确结果,而且有可能产生意想不到的错误,这就是一个典型的数组越界错误。如下:

#include<iostream>
using namespace std;int main()
{int a[10], b[10];for (int i = 1; i <= 10; i++){a[i] =  i * 2 - 1; ;b[10 - i - 1] = a[i];}for (int i = 1; i <= 10; i++){cout << "a[" << i << "]=" << a[i] << endl;cout << "b[" << i << "]=" << b[i] << endl;}return 0;
}

运行结果:
在这里插入图片描述

2.数组的存储与初始化

(1)数组的存储

**数组元素在内存中是顺序、连续存储的。**数组元素在内存中占据一组连续的存储单位,逻辑上相邻的元素在物理地址上也是相邻的。一维数组是简单地按照下标的顺序连续存储的。多维数组的元素也是顺序、连续存储的,其存储顺序的约定非常重要。

元素的存储顺序问题关系到对数组做整体处理时,以什么样的顺序对数组元素进行操作。C++中很多操作都与数组元素的存储顺序相关,如数组初始化、函数间的数据传递等。

①一个一维数组可以看作是数学上的一个列向量,各元素是按下标从小到大的顺序连续存放在计算机内存单元中。例如,数组声明语句:

int arr[5];

声明了一个有5个元素的一维int型数组,可以看作是列向量[arr[0],arr[1],arr[2],arr[3],arr[4]],元素在内存中的存放顺序如下图所示:
在这里插入图片描述

②一个二维数组可以看作数学中的一个矩阵,第一个下标称为行标,第二个下标称为列标。例如,数组声明语句:

int m[2][3];

声明了一个数组,相当于一个2行3列的矩阵:
在这里插入图片描述
但在C++中,数组元素每一维的下标都是从0开始的,因此在程序中,矩阵M就被表示为:
在这里插入图片描述
其中,元素m[1][0],行标为1,列标为0,表示矩阵第2行第1个元素。二维数组在内存中是按行存放的,即先放第1行,再放第2行…每行中的元素是按列下标从小到大的顺序存放,这样的存储方式也称为优先存储。二维数组m在内存中的存放顺序如下图所示:
在这里插入图片描述
【注意】
C++中二维数组被当作一维数组的数组。例如int m[2][3]所定义的m,可以看作是这样一个数组,它的大小是2,每一个元素都是一个大小为3、类型为int的数组。由于数组的每个元素都要存放在连续空间中,因此二维数组自然会按行优先的顺序存储。

③多维数组也是采取类似的方式顺序存放。

(2)数组的初始化

数组的初始化就是在声明数组时给部分或全部元素赋初值。对于基本类型的数组,初始化过程就是给数组元素赋值;对于对象数组,每个元素都是某个类的一个对象,初始化就是调用该对象的构造函数。

声明数组时给出数组元素的初值,例如:

#include<iostream>
using namespace std;int main()
{int a[10] = { 1,2,3,4,5,6,7,8,9,10 };for (int i = 0; i < 10; i++){cout << "a[" << i << "]=" << a[i] << endl;}return 0;
}

运行结果:
在这里插入图片描述
表示声明了一个具有10个元素的int型数组,数组元素a[0],a[1],…,a[10]的值分别为1,2,3,4,5,6,7,8,9,10。声明数组时如果列出全部元素的初值,可以不用说明数组元素的个数,下面语句和int a[10] = { 1,2,3,4,5,6,7,8,9,10 };语句完全等价:

int a[] = { 1,2,3,4,5,6,7,8,9,10 };

当然,也可以只对数组元素中的部分元素进行初始化,比如声明一个有5个元素的浮点型数组,给前3个元素分别赋值1.0,2.0,3.0,可以写为:

int main()
{float fa[5] = { 1.0,2.0,3.0 };int a[10] = { 1,2,3,4,5,6,7,8,9,10 };for (int i = 0; i < 5; i++){cout << "a[" << i << "]=" << fa[i] << endl;}return 0;
}

运行结果:
在这里插入图片描述
这时数组元素的个数必须明确指出,对于后面没有赋值的两个元素,也不用做任何说明。初始化只能针对所有元素或者从起始地址开始的前若干元素,而不能间隔赋初值。

【注意】
当指定的初值个数小于数组大小时,剩下的数组元素会被赋予0值。若定义数组时没有指定任何一个元素的初值,对于静态生存期的数组,每个元素仍然会被赋值为0;但对于动态生存期的数组,每个元素的初值都是不确定的。例如:
①静态生存期的数组

#include<iostream>
using namespace std;int main()
{static int a[10]for (int i = 0; i < 10; i++){cout << "a[" << i << "]=" << a[i]<<" ";}return 0;
}

运行结果:
在这里插入图片描述
②动态生存期的数组

#include<iostream>
using namespace std;int main()
{int a[10];for (int i = 0; i < 10; i++){cout << "a[" << i << "]=" << a[i] << ",";}cout << endl;return 0;
}

运行结果:
在这里插入图片描述
多维数组的初始化也遵守同样的规则。此外,如果给出全部元素的初值,第一维的下标个数可以不用显式说明,例如:

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

等价于:

int a[][3]={1,0,0,0,1,0};

多维数组可以按第一维的下标进行分组,使用花括号将每一组的数据括起来。对于二维数组,可以分行用花括号括起来。下面的写法与上面的语句完全等效:

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

采用括号分组写法,容易识别,易于理解。

此外,数组也可以被声明为常量,例如:

const float fa[5]={1.0,2.0,3.0};

它表明fa数组中每个元素都被当作常量对待,也就是说它们的值在初始化后皆不可以改变。声明为常量的数组,必须给定初值。

相关文章:

C++ 数组

数组是具有一定顺序关系的若干对象的集合体&#xff0c;组成数组的对象称为该数组的元素。 数组元素用数组名与带方括号的下标表示&#xff0c;同一数组的各个元素具有相同的类型。数组可以由除void型以外的任何一种类型构成&#xff0c;构成数组的类型和数组之间的关系&#x…...

Android LinearLayout dynamic add child ImageView,Glide load,kotlin

Android LinearLayout dynamic add child ImageView&#xff0c;Glide load&#xff0c;kotlin images.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"andro…...

HTML 是什么?它的全称是什么?

聚沙成塔每天进步一点点 专栏简介HTML是什么&#xff1f;HTML的全称是什么&#xff1f;写在最后 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对We…...

ATF(TF-A)安全通告

目录计划如下&#xff0c;相关内容补充中&#xff0c;待完成后进行超链接&#xff0c;敬请期待&#xff0c;欢迎关注 1、Advisory TFV-1 (CVE-2016-10319) 2、Advisory TFV-2 (CVE-2017-7564) 3、Advisory TFV-3 (CVE-2017-7563) 4、Advisory TFV-4 (CVE-2017-9607) 5、Adviso…...

LVS—DR集群的搭建

目录 lvs-dr模式工作原理&#xff1a; 搭建结构&#xff1a; 1、RS&#xff1a; 1&#xff09;两台RS准备好httpd环境和测试文件 2&#xff09;添加虚拟IP&#xff08;vip&#xff09;、添加访问本地vip的静态路由 并抑制ARP 2、DS&#xff1a; 1&#xff09;安装ipvasadm…...

如何理解容量测试?如何做容量测试?

1、如何理解容量测试&#xff1f; 容量测试&#xff0c;是性能测试里的一部分&#xff0c;它的目的是测量系统的最大容量&#xff0c;为系统扩容、性能优化提供参考&#xff0c;节省成本投入&#xff0c;提高资源利用率。就是运用各种方法和工具在这种复杂的情况下去不断验证容…...

文件上传漏洞(webshell)

一、防护 1、防护 1、判断文件后缀&#xff0c;为图片的话才让上传成功。 2、解析文件内容&#xff08;文件幻数&#xff09;判断文件头和文件尾部是否一致 幻数 常见的 3、隐藏按钮&#xff08;带上code唯一值&#xff09; 4、二次渲染&#xff08;类似拿着你的图片&#xff…...

.net几行代码音乐API各排行榜 热搜 入库

对比了几家大厂的音乐API的接口 这家相对规范些 现在开始从零开始 net6敏捷开发对接 入库吧 关键技术工具和思维 1 json 生成类 2 分析类 规划表设计3 sqlsuger codefirst 生成表 4 封装get post 连接5 类映射automapper6 sqlsuger 插入数据 1 json 生成类 宇宙 第 一的…...

使用gpt对对话数据进行扩增,对话数据扩增,数据增强

我们知道一个问题可以使用很多方式问&#xff0c;但都可以使用完全一样的回答&#xff0c;基于这个思路&#xff0c;我们可以很快的扩增我们的数据集。思路就是使用chatgpt或者gpt4生成类似问题&#xff0c;如下&#xff1a; 然后我们可以工程化这个过程&#xff0c;从而快速扩…...

算法练习工程1.2

题目要求&#xff1a; * 问题标题&#xff1a;删除有序数组中的重复项&#xff1a; * 题意说明&#xff1a; * 给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。 * …...

数字IC流片经历有多重要?怎样才能有流片机会?

都说拥有流片经验可以显示你在实际项目中的实践能力和对整个设计流程的了解程度&#xff0c;流片经历的重要性不言而喻。 什么是芯片流片 像流水线一样通过一系列工艺步骤制造芯片&#xff0c;这就是流片。在芯片制造过程中一般有两段时间可以叫作流片。 流片&#xff1a;英…...

fontfaceobserver 第三方字体加载优化方案

fontfaceobserver 第三方字体加载优化方案 1. github地址 https://github.com/bramstein/fontfaceobserver 2. 基础使用方法 const font new FontFaceObserver(My Family, {weight: 400 });font.load().then(function () {console.log(Font is available); }, function ()…...

laravel安装composer依赖

一.问题描述 拉取的新项目没有依赖 项目根目录没有vendor目录 报错 二.安装composer,拉取依赖 1.如果没有composer先去下载 官网地址:Packagist / Composer 中国全量镜像 我的博客安装composer:composer最新版本安装_荒-漠的博客-CSDN博客 2.进入项目根目录cmd或者在项目中…...

问题聚集度Hive SQL

问题聚集度&#xff1a;最小的分母占比&#xff0c;贡献最多的分子占比&#xff0c;即小规模贡献大问题。 selectcity_name,user_id,rf_type,deal_ord_cnt,sale_amt,rf_ord_cnt,rf_amt,rf_ra,rf_amt_ra,rf_all,ord_cnt_all,rf_gx,ord_cnt_gx,del_gx,row_number() over(partiti…...

Windows11右键菜单

刚开始使用Windows11时&#xff0c;新的右键菜单用起来很不习惯。 记录一下修改和恢复Windows11的右键菜单的方法。 1.Win11切换到旧版右键菜单&#xff1a; 方法&#xff1a;WinR打开CMD&#xff0c;运行下面的命令行 添加注册列表重启Windows资源管理器 reg add "HKC…...

篇十四:观察者模式:对象间的通知与更新

篇十四&#xff1a;“观察者模式&#xff1a;对象间的通知与更新” 设计模式是软件开发中的重要知识&#xff0c;观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;用于在对象间建立一种一对多的依赖关系&#xff0c;当一个对象的状态发生…...

Hadoop知识点总结

1. MapReduce中Shuffle的执行流程是什么样的&#xff1f; - 阶段&#xff1a;Map端Shuffle、Reduce端Shuffle - 功能&#xff1a;分区、排序、分组 Map端Shuffle 分区(Partition)&#xff1a;在这个阶段&#xff0c;Map任务会调用分区器&#xff0c;根据Key的Hash值取模&a…...

相关搜索量激增10000%!“芭比周边”产品火爆亚马逊!

据外媒报道&#xff0c;芭比娃娃是今年夏天最热的话题。今年7月份&#xff0c;“芭比娃娃”是亚马逊上搜索最多的词。第二季度&#xff0c;Shopify上的芭比娃娃销量激增了56%。知名玩具制造商美泰&#xff08;Mattel&#xff09;预计&#xff0c;受电影的推动&#xff0c;在未来…...

C高级第四讲

1、思维导图 2、写一个shell函数&#xff0c;获取用户的uid和gid并使用变量接收 #!/bin/bash function get_id() {uidid -u ubuntugidid -g ubuntu } get_id echo "uid:$uid" echo "gid:$gid"运行结果 3、排序 冒泡排序 /* ------------------------…...

Idea小操作

Idea操作 idea提取内容构成一个方法 idea提取内容构成一个方法...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...