C++中的数组详情
作者:Coder_LT 发布时间:2022-02-23 19:06:11
1、数组
数组其实也是一种数据格式,不过是一种复合类型,它可以存储多个同类型的值。
使用数组可以将同类型的变量整合起来管理,比如说我们现在要记录三个同学的考试得分。我们当然可以写成int a1
, a2
, a3
;,看起来也不会很麻烦。但如果我们有 50 个同学呢?如果有 5000 个同学呢?显然就不能通过这种方式了,何况每个变量都要起一个独一无二的名字,这也很麻烦。
使用数组就不会有这样的问题,我们只需要规定数组的长度,通过一个变量就可以存储任意多个值。有 5000 个同学就写成int scores[5000]
;就都能存下了。
定义一个数组只需要三个要素:变量类型
、数组名
、数组长度
即可。
typename arrayName[arraySize];
有一点需要注意,arrayName
的类型不是数组,而是typename
数组。也就是说数组也是区分类型的,这也是 C++中的数组和 Python
中 List
的区别之一。
2、数组的使用
2.1 元素访问
对于一个数组来说,当我们需要访问其中的元素时,可以通过下标的方式来访问。
在绝大多数计算机程序当中,数组的下标通常都是从 0 开始的。第一个数存在第 0 位,第二个数存在第 1 位,以此类推。下标通过方括号表示,
如:
cout << arrayName[0] << endl;
注意:我们传入的下标不能大于等于数组的长度(由于是从 0 开始的),编译器往往不会报错,只会给出一个警告,但运行的过程当中可能会引发各种意想不到的问题。因为很可能你访问的内存已经超过了程序管理的范围,访问到了一些操作系统内存或者是其他禁止访问的内存,引起难以想象的后果。
int a[3];
cout << a[10] << endl;
在上面的例子当中,我们声明了一个长度为 3 的数组,但是访问了下标 10。这显然超出了数组的范围,但是当我们编译的时候编译器并不会报错,只会抛出一个警告。要知道程序员往往是看不见警告的。
如果一不小心就会错过这个信息,导致潜在的风险。所以在访问之前一定要切记,确保下标在数组的范围内。
2.2 初始化
数组和其他变量一样,也可以在声明的时候进行初始化。
最常见的方式是将它的每一个元素的值写出来:
int a[3] = {0, 1, 2};
编译器会将花括号当中的元素一个一个地填到数组对应的位置当中,花括号当中的元素数量并不一定需要和数组长度相等,如果小于数组长度,那么就会初始化对应数量的元素。
int a[3] = {0, 1};
那么数组 a 的前两位会被初始化成 0 和 1,其他的位置会被初始化为0。
如果想要将数组当中所有元素都初始化成 0,则比较特殊,我们只需要写一个 0 即可。
int a[100] = {0};
但只有初始化成 0 的时候可以这么操作,如果传入其他值,则不会生效。
还有一种初始化方式是我们不填数组的长度,而通过初始化的方式让编译器替我们去算:
int a[] = {0, 1, 2, 3, 4};
编译器通过执行初始化知道 a 数组的长度为 5,不过 C++ primer
强烈建议我们不用这么干。因为我们人工数出来的结果可能和编译器不一样(我们会犯错),增加我们 debug
的难度。
3、C++11 的初始化方式
C++11 当中对于数组的初始化又有了一些新的定义,首先是可以省略等号:
int a[3] {1, 2, 3};
其次花括号内可以留空,这等价于将元素全部设置为 0:
int a[100] = {};
int b[10] {};
列表初始化时禁止缩窄转化,我们在上一篇文章当中讲过:
char cs[4] = {0, 0x3f3f3f3f, 'a', 'z'}; // 禁止,因为0x3f3f3f3f超过了char范围
注:文章转自微信公众号:Coder梁(ID:Coder_LT)


猜你喜欢
- 一、委托1、什么是委托委托是面向对象的、类型安全的,是引用类型。使用delegate关键字进行定义。委托的本质就是一个类,继承自System
- 1.新建文件上传页面在static目录中新建upload-test.html,上传页面代码如下所示:<!DOCTYPE html>
- 参考了一下网上别人写的,再使用的时候是放在新开的线程中来播放音乐的,后来发现每次进入Activity后就会重复开始一个音乐播放的声音。为了避
- 示例:导入相关数据(Excel文件),相关的文件数据编辑好。XML文件配置再spring的xml文件中配置要上传文件的大小<!-- 上
- 最近一段时间不想使用Session了,想感受一下Token这样比较安全,稳健的方式,顺便写一个统一的接口给浏览器还有APP。所以把一个练手项
- 本文实例为大家分享了android自定义滚动上下回弹scollView的具体代码,供大家参考,具体内容如下这是一个自定义view,在xml布
- 先执行以一个简单的示例:static void Main(string[] args) { &nb
- 目录1、备份原数据库File文件2、数据库升级XML编写 updateXml.xml3、创建XML解析器3.1 对应工具类 DomUtils
- java Mybatis存进时间戳封装了一个实体类,里面有个字段 Integer createTime。要利用这个实体类将一个时间戳存进数据
- 查看公司项目代码时,存在这样一个问题:winform界面上有很多信息填写,提交
- 用Visual Studio等IDE写C#的Hello World非常简单,但脱离了IDE你能不能打印出Hello World呢?这不是说工
- 1、Spring的事务管理主要包括3个接口TransactionDefinition:封装事务的隔离级别,超时时间,是否为只读事务和事务的传
- 1. 引入依赖pom文件引入activemq依赖<!--activeMq配置--> &
- 前言我们在上一篇文章教大家使用ImageView+TextView的组合自定义控件...可能在开发中你还需要其他功能,例如:按下效果,可以在
- WPF的InkCanvas就是一个画板,可以在上面随意涂鸦,每写上一笔,InkCanvas的Strokes集合里就新增一个涂鸦对象,下面的代
- 需求:Android客户端连接服务器端MySQL数据库中的内容环境部署服务器:apache-tomcat-8.5.9语言版本:Java 1.
- File类概述File类能新建、删除、重命名文件和目录,但不能访问文件内容本身,如果需要访问文件内容本身,则需要使用后续的输入/输出流。要在
- Flutter中的默认导航分成两种,一种是命名的路由,一种是构建路由。一、命名路由传参应用入口处定义路由表class MyApp exten
- C#代码与javaScript函数的相互调用 问: 1.如何在JavaScript访问C#函数? 2.如何在JavaScript访问C#变量
- 本示例演示如何通过设置Intent对象的标记,来改变当前任务堆栈中既存的Activity的顺序。1. Intent对象的Activity启动