为什么数组的下标是从0开始呢?

我们在许多的编程语言中,大部分的数组下标都是从零开始的,那为什么不是从一开始的呢?

首先我们,先要了解数组相关的定义。

  • 数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。
  • C语言中,下标的含意是:当前元素到第一个元素的偏移量。第一个元素的下标自然就是0,第二个元素的下标为1,第n个元素的下标为n-1。

下标从0开始的原因就是为了寻址方便

计算机会给每个内存单元分配地址,并且通过地址来访问内存中的数据。当计算机想要随机访问数组中的某个元素时,他就会通过下面的寻址公式:

a[i]_address = base_address + i * data_type_size

而如果下表从1开始,那么就会变成:

a[i]_address = base_address + ( i - 1 ) * data_type_size

对比两个代码,会发现下标从1开始时,每次随机根据下标访问数组元素时,对于CPU来说,会多一个减法运算。 数组作为非常基础的数据结构,通过下标随机访问数组元素又是其非常基础的编程操作,效率的优化就要尽可能做到极致。所以为了减少一次减法操作,数组选择了从 0 开始编号,而不是从 1 开始。

还有另一种理解方式(偏移量):在内存就开辟了一块地址空间(内存中地址空间都是连续的,地址中的内容就是你存储在其中的值),然后变量a就指向了这片地址空间的“首”地址,如果想要访问这片地址的其他地址,那么就得用偏移量来计算。

变量a已经指向首地址,a[0] = a + 0 ,0代表的就是偏移量,a偏移0个单位,就是其本身,所以a[0]代表的就是第一个地址。 a[1] = a + 1; a偏移一个单位,那么就可以访问到a[1],也就是第二个地址。所以只需要 变量名+[偏移量] ,(如 a[0]) 就可以访问到相应的内存地址。这是下标从0开始的情况。

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

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

相关文章

Android 3D Launcher锁定IMU界面

故事背景: 最近工厂反馈由于VR设备老化测试完成之后,变绿界面不明显,只占3D系统一部分,每次需要戴头盔,才能确定老化完成。导致工厂效率变低,如果后期产能变大,效率更低。 1、针对以上需求我们需要拆分 1、…

【SPSS】基于RFM+Kmeans聚类的客户分群分析(文末送书)

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

R-FCN: Object Detection via Region-based Fully Convolutional Networks(2016.6)

文章目录 AbstractIntroduction当前最先进目标检测存在的问题针对上述问题,我们提出... Our approachOverviewBackbone architecturePosition-sensitive score maps & Position-sensitive RoI pooling Related WorkExperimentsConclusion 原文链接 源代码 Abstr…

14. 机器学习 - KNN 贝叶斯

Hi,你好。我是茶桁。 咱们之前几节课的内容,从线性回归开始到最后讲到了数据集的处理。还有最后补充了SOFTMAX。 这些东西,都挺零碎的,但是又有着相互之间的关系,并且也都蛮重要的。并且是在学习机器学习过程当中比较…

IDE的组成

集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务…

Java面向对象(进阶)-- 拼电商客户管理系统(康师傅)

文章目录 一、目标二、需求说明(1)主菜单(2)添加客户(3)修改客户(4)删除客户(5)客户列表 三、软件设计结构四、类的设计(1)Customer类…

20.1 OpenSSL 字符BASE64压缩算法

OpenSSL 是一种开源的加密库,提供了一组用于加密和解密数据、验证数字证书以及实现各种安全协议的函数和工具。它可以用于创建和管理公钥和私钥、数字证书和其他安全凭据,还支持SSL/TLS、SSH、S/MIME、PKCS等常见的加密协议和标准。 OpenSSL 的功能非常…

matlab创建矩阵、理解三维矩阵

1.创建矩阵 全0矩阵:a zeros(2,3,4) 全1矩阵:a ones(2,3,4) !和python不一样的地方!此处相当于创建了4页2行3列的矩阵,而在python里是2页3行4列。 对第1页的第2行第3列元素进行修改:

拉扎维模拟CMOS集成电路设计西交张鸿老师课程P2~5视频学习记录

目录 p2 p3 p4 p5 --------------------------------------------------------------------------------------------------------------------------------- p2 -----------------------------------------------------------------------------------------------------…

进程程序替换

什么是进程程序替换: 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数 以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动 例程开始执行。调用ex…

Qt配置OpenCV教程,亲测已试过

详细版可参考:Qt配置OpenCV教程,亲测已试过(详细版)_qt opencv_-_Matrix_-的博客-CSDN博客 软件准备:QtOpenCVCMake (QtOpenCV安装不说了,CMake的安装,我用的是:可参考博客&#x…

《动手学深度学习 Pytorch版》 10.6 自注意力和位置编码

在注意力机制中,每个查询都会关注所有的键-值对并生成一个注意力输出。由于查询、键和值来自同一组输入,因此被称为 自注意力(self-attention),也被称为内部注意力(intra-attention)…

【深度学习】吴恩达课程笔记(一)——深度学习概论、神经网络基础

笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ 吴恩达课程笔记——深度学习概论、神经网络基础 一、概念区别1.深度学习与机器学习2.深度学习与神经网络 二、什么是神经网络1.分类2.特点3.工作原理4.神经网络示意图5.神经网络进行监督学习6.深度学习的发展 三、…

Domino中的源代码管理工具

大家好,才是真的好。 上次Notes/Domino 14 Drop2发布的时候,我们就提到,HCL一起发布了一款源代码管理工具。 这里还是简单科普一下,源代码管理工具,可以实现代码版本控制、备份,还有多个程序员之间的协作…

2023版 STM32实战12 IIC总线读写AT24C02

IIC简述 一个多主从的串行总线,又叫I2C,是由飞利浦公司发明的通讯总线 IIC特点 -1- 串行(逐bit传输) -2- 同步(共用时钟线) -3- 半双工(收发不同进行) -4- 总线上的任何设备都可以是主机 开发使用习惯和理解 -1- 通过地址寻址 -2- 数据线的…

JVM进阶(2)

一)方法区: java虚拟机中有一个方法区,该区域被所有的java线程都是共享,虚拟机一启动,运行时数据区就被开辟好了,官网上说了方法区可以不压缩还可以不进行GC,JAVA虚拟机就相当于是接口,具体的HotSpot就是虚…

IP应用场景API的反欺诈潜力:保护在线市场不受欺诈行为侵害

前言 在数字化时代,网络上的商业活动迅速增长,但与之同时,欺诈行为也在不断演化。欺诈者不断寻找新方法来窃取个人信息、进行金融欺诈以及实施其他不法行为。为了应对这一威胁,企业和组织需要强大的工具,以识别和防止…

VScode远程连接错误:进程试图写入不存在的管道

使用VScode连接树莓派时,出现远程连接错误:进程试图写入不存在的管道 解决方案: (1)可以进入config所在文件夹,删除文件 (2)无法解决的化尝试下述方法 输入 Remotting-SSH:Settin…

Go学习第十八章——Gin日志与第三方工具Logrus

Go web框架——Gin日志与第三方工具Logrus Gin日志功能1 基础介绍1.1 快速入门1.2 日志基础使用1.3 将日志输出到文件 2 定义路由格式3 修改日志级别4 修改日志格式 第三方日志工具logrus1 快速入门1.1 安装1.2 使用 2 基本功能使用2.1 设置日志输出格式2.2 设置日志输出位置2.…

【C++初阶(三)】引用内联函数auto关键字

目录 前言 1. 引用 1.1 引用的概念 1.2 引用的特性 1.3 引用的权限 1.4 引用的使用 1.5 引用与指针的区别 2. 内联函数 2.1 什么是内联函数 2.2 内联函数的特性 3. auto关键字 3.1 auto简介 3.2 auto使用规则 3.3 auto不能使用的场景 4. 基于范围的for循环 4.1 范围for…