精华内容
下载资源
问答
  • 2022-04-05 23:00:28

    一、数组下标从0开始的原因

    在回答这个问题之前我们首先要明确一点那就是对于数组元素的访问在操作系统层其实就是对特定内存偏移量的数据的访问,换而言之即如果想要访问一个数组的某一个元素的值那么首先就要计算它的地址偏移量 ,其大概的公式为:

    a[k]_adress = base_address + k*type_size ;
    

    ,倘若数组下标是从1开始那么地址计算公式即会转变为:

    a[k]_adress = base_address + (k-1)*type_size ;
    

    这对于CPU来说多了一次减法操作,对于那些对性能要求特别高的程序来说就是一个不小的性能影响因素。所以数组下标一般都是从0开始,另外的一个原因则是C语言数组下标便是从0开始的,后面的高级编程语言包括 java、C++、javascript等都在一定程度 上效仿了C语言。

    更多相关内容
  • 在大部分编程语言中,数组都是0开始编号的,但你是否下意识想过,为什么数组0开始编号,而不是1开始呢? 从1开始不是更符合人类的思维习惯吗?下面以这个问题来学习数组。 如何实现随机访问? 什么是数组?...

    1. 数组:为什么很多编程语言中数组都是从0开始?

    在大部分编程语言中,数组都是从0开始编号的,但你是否下意识想过,为什么数组要从0开始编号,而不是1开始呢? 从1开始不是更符合人类的思维习惯吗?下面以这个问题来学习数组。

    数组的基本概念与特性

    什么是数组?

    什么是数组?估计你心中已经有了答案。不过,这里还是总结一下。数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据
    这里定义里有几个关键词,理解了这几个关键词,就能彻底掌握数组的概念了。

    线性表(Linear List)。顾名思义,线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。除了数组,链表、队列、栈等也是线性表结构。

    而与它相对立的概念是非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为在非线性表中,数据之间并不是简单的前后关系。

    总结下数组的特性

    • 第一是线性表(Linear List)。
    • 第二是连续的内存空间和相同类型的数据。

    正是因为这两个限制,它才有一个堪称“杀手锏”的特性 “随机访问” 。但有利就有弊,这两个限制也让数组的很多操作变得非常低效,比如要想在数组中删除、插入一条数据,为来保证连续性,就需要左大量的数据搬移工作。

    如何实现随机访问?

    数组到底是如何实现根据下标随机访问数组元素的?
    例如:长度为 10 的 int 类型的数组 int[] a = new int[10]

    1. 计算机给数组 a[10] ,分配了一块连续内存空间 1000 ~ 1039 ;
    2. 内存块的首地址为 base_address = 1000 ;
    3. 计算机会给每个内存单元分配一个地址,计算机通过地址来访问内存中的数据。

    当计算机需要随机访问数组中的某个元素时,它会通过下面的寻址公式,计算出该元素存储的内存地址:
    a[i]_address = base_address + i * data_type_size

    arr[i] 首地址 = 数组内存块首地址 + 数据类型大小 * i,其中 i 为偏移量,其中 data_type_size 表示数组中每个元素的大小。

    上面这个例子里面:
    base_address :内存块的首地址。
    data_type_size : 表示数组中每个元素的大小,比如目前数组中存储的是 int 类型数据,所以 data_type_size 就为 4 个字节。

    数组时间复杂度

    数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。
    注意点:

    1. 数组是一种线性表;
    2. 连续的内存空间和相同类型的数据。
      由于第二个性质,数组支持 “随机访问”,根据下标随机访问时间复杂度为 O(1),但是在数组中删除、插入数据时需要做数据搬移工作。

    低效的“插入”和“删除”操作

    1. 插入操作

    假如数组的长度为 n,我们需要将一个数据插入到数据的第 k 个位置,则需要将 [k , n] 位元素都顺序地往后挪动一位。

    • 最好的情况:时间复杂度为O(1),此时在数组末尾插入元素。
    • 最坏的情况:时间复杂度为O(n),此时在数组开头插入元素。
    • 平均的情况:时间复杂度为O(n),因为在每个位置插入元素的概率相同,故(1+2+3+......+n)/ n = O(n)

    2. 删除操作

    和插入操作一样,为了保证内存的连续性,删除操作也需要搬移数据。

    • 最好的情况:时间复杂度为O(1),此时删除数组末尾的元素。
    • 最坏的情况:时间复杂度为O(n),此时删除数组开头的元素。
    • 平均的情况:时间复杂度为O(n),因为删除每个位置的元素的概率相同,故(1+2+3+…+n)/ n = O(n)。

    更高级用法

    在某些特殊场景下,在不追求数组中数组的连续时,我们将多次删除操作集中在一起执行,会提高删除的效率?
    例如:假设有一个数组 a , 长度为 10,存储了 8 个元素,分别为 a,b,c,d,e,f,g,h 。现在我们依次删除 a,b,c 三个元素:

    a = [a,b,c,d,e,f,g,h];
    

    为了避免 d,e,f,g,h 这个几个数据会被搬移 3 次,我们先记录已经删除的数据(每次删除操作并不是真正的搬移数据,只是记录数据已经被删除)。当 a 数组没有空间存储数据时,这才触发依次真正的删除操作,这样就减少了删除操作导致的数据搬移。

    上述这个操作其实就是 JVM标记清除垃圾回收算法 的核心思想。

    3. 警惕数组访问越界

    在 C 语言中,只要不是访问受限的内存,所有的内存空间都是可以自由访问的。如果疏忽会造成严重的后果。当然,Java语言会自动检测。

    4. 总结
    **
    数组是最基础、最简单的数据结构。数组用一块连续的内存空间,来存储相同类型的一组数据,最大特点就是随机访问元素,并且时间复杂度为 O(1)。但是插入、删除操作也因此比较低效,时间复杂度为O(n)。

    数组和链表的区别

    • 数组支持随机访问,根据下标随机访问的时间复杂度为O(1),注意数组查找,即便是排好序的数组,使用二分查找时间复杂度为O(logn)。
    • 链表适合插入、删除、时间复杂度为O(1)

    最后总结一下:为什么大多数编程语言中,数组要从 0 开始编号,而不是从 1 开始呢?

    • 第一:历史原因, c 语言设计者用 0 开始计数数组下标,之后 Java、JavaScript等高级语言都效仿 C 语言,因此继续沿用从 0 开始计数的习惯。部分语言数组不是从 0 开始计数的,比如 Matlab,还有部分语言支持负数下标,如 Python。

    • 第二:从数组存储的内存模型上来看,“下标”最确切的定义应该是 “偏移(offset)”。前面也讲到,如果用 a 来表示数组的首地址,a[0] 就是偏移为 0 的位置,也就是首地址,a[k] 就表示偏移 k 个 type_size 的位置,所以计算 a[k] 的内存地址只需要用这个公式:

    a[k]_address = base_address + k * type_size
    但是,如果数组从1 开始计数,那我们计算数组元素 a[k] 的内存地址就会变为:
    a[k]_address = base_address + (k-1)* type_size

    对比两个公式,不难发现,从 1 开始编号,每次随机访问数组元素都多来一次减法运算,对于 CPU 来说,就多来一次减法指令。

    数组作为非常基础的数据结构,通过下标随机访问数组元素又是其非常基础的编程操作,效率的优化就要尽可能做到极致,所以为来减少一次减法操作,数组选择来从 0 开始编号,而不是 1 开始。

    以上谢谢大家,求赞求赞求赞!

    💗 大佬们随手关注下我的wx公众号【一角钱小助手】和 掘金专栏【一角钱】 更多题解干货等你来~~

    展开全文
  • 数组的下标什么开始

    千次阅读 2021-03-23 21:50:30
    数组的下标0开始数组是有序的元素序列。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。本文操作环境:windows10系统、ThinkPad t480...

    数组的下标从0开始。数组是有序的元素序列。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。

    00075aff511264b768a3552f49c33a05.png

    本文操作环境:windows10系统、ThinkPad t480电脑。

    数组的下标从0开始。

    详细介绍:

    数组(Array)是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。

    数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式。这些有序排列的同类数据元素的集合称为数组。

    数组是用于储存多个相同类型数据的集合。

    数组中的所有元素都具有相同类型(这一点和结构或类中的字段不同,它们可以是不同类型)。数组中的元素存储在一个连续性的内存块中,并通过索引来访问(这一点也和结构和类中的字段不同,它们通过名称来访问)。

    数组元素并非只能是基元数据类型,还可以是结构、枚举或类。

    更多计算机编程相关知识,请访问:编程入门!!

    展开全文
  • 当我们定义了一个字符数组时,有时会想下标为x进行输入。 char str[N];//定义长度为N的字符数组 输入时采用以下格式: scanf("%s",str + x); cin >> str + x;//这两种输入方式都可行 例如:若想下标为1...

    C/C++中的一个小技巧

    当我们定义了一个字符数组时,有时会想从下标为x进行输入。

    char str[N];//定义长度为N的字符数组
    

    输入时采用以下格式:

    scanf("%s",str + x);
    cin  >> str + x;//这两种输入方式都可行
    

    例如:若想从下标为1进行输入

    char str[N];
    scanf("%s" , str + 1);
    cin >> str + 1;//这两种输入方式都可行
    
    展开全文
  • 为什么数组0开始

    千次阅读 2020-12-04 03:26:59
    本文通过汇总一些网上搜集到的资料...这个和我们平时生活中从1开始编号的习惯相比显得很反人类。那么究竟是什么样的原因让大部分编程语言数组都遵从了这个神奇的习惯呢?本文最初是受stackoverflow上的一个问题的启...
  • 把python 数组,量化为从1开始数组

    千次阅读 2014-09-09 15:11:35
    问题描述: 比方我有一个数组:[10,12,3,4,9]
  • 数组的下标为什么0开始而不是从1开始

    万次阅读 多人点赞 2020-02-25 18:45:56
    如果从1开始,则a[i]的地址= 首地址 + (i-1)*每个数据所占的长度。 是不是前一种更好计算呢。 再举个例子: 1、数组在内存中申请是,所申请的内存是一段连续的内存地址; 2、例:int[] a=new int[3];申请一段:int ...
  • 数组,想必大家都不陌生,经常在编程的时候都会使用。但是你是否和我一样都存在一个疑惑:为什么数组0开始编号?正常人不都是1开始计数的吗?笑话,咱们干这行的是正常人吗?
  • 为什么数组角标0开始

    千次阅读 2021-02-28 06:39:20
    这个和我们平时生活中从1开始编号的习惯相比显得很反人类。那么究竟是什么样的原因让大部分编程语言数组都遵从了这个神奇的习惯呢?本文最初是受stackoverflow上的一个问题的启发,通过搜集和阅读了一些资料在这里做...
  • 为什么数组下标0开始

    千次阅读 2020-12-23 21:58:52
    背景有很多编程语言的数组都是 0 开始编号,你是否下意识地想过,为什么数组 0 开始编号,而不是 1 开始呢? 1 开始不是更符合人类的思维习惯吗?那先看下数组的定义。 数组(Array)是一种线性表数据结构...
  • C#定义数组1

    万次阅读 2019-03-28 09:27:04
    1.定义一维数组 int[] aqiArray=new int[]; 报错:[]索引内的数据有误;应为1 数组创建必须有初始大小或数组初始值 2.数组创建必须定义数组大小或数组初始值设定项 string[] str =new string[3]; string[] ...
  • 对于学习过编程语言的人来说,相信绝大多数人都会有这样的疑问:我们平时计数,通常是开始计数的,为什么在编程语言中,数组的下标是0开始计算的呢?  这是因为,C语言中,下标的含意是:当前元素到第一个...
  • 如何查找一个数组内,某个元素的index是多少? 如果element元素唯一,可以用match查, 但是 application.match 比 worksheetfunction.match() 函数更健壮 如果不唯一呢 用match 只能返回第一个查到的元素的index...
  • 为什么数组都是0开始

    千次阅读 2019-11-06 16:18:31
    我们所知的大部分编程语言中,数组都是0开始的,但你是否思考过,为什么数组从0开始编号,而不是1开始呢?从1开始不是更符合我们的日常习惯吗? 什么是数组 数组(Array)是一种线性表数据结构。它用一组连续的...
  • 数组下标索引为什么0开始

    千次阅读 2020-08-17 21:26:17
    也不是所有的高级程序语言都是如此,比如Python数组下标就...(1)下标0开始数组寻址——arr[i] = base_address + i * type_size 其中base_address为数组arr首地址,arr[0]就是偏移量为0的数组,即数组arr首地.
  • 也不是所有的高级程序语言都是如此,比如Python数组下标就支持负数。
  • 为什么数组0开头,而不是1

    千次阅读 2019-12-19 17:48:56
    我们常用的开发语言,比如C语言,C#,Java,Nodejs,Swift等,他们的数组起始编号都是0,这个原因究竟是什么,已经很难回滚到历史开始的阶段进行追溯,不过,我们也可以做一些分析和总结。 1. 索引更快速 数组本身的...
  • C语言数组元素下标为何0开始

    万次阅读 多人点赞 2016-05-06 11:24:51
    很多同学可能在学习数组时会有这个疑问,下标为什么不从1开始呢?从1开始不是更符合大家的日常习惯吗?生活中我们通常说第1个,而不是第0个。的确,有些计算机语言如早期的Pascal语言,数组元素的下标是从1开始的。...
  • 程序风格---数组下标全部从1开始

    千次阅读 2010-06-10 09:53:00
    一、数组下标全部从1开始  如需定义一个大小为13的数组,则应该这样定义: double dData[14];   实际使用中数组下标从1开始,即让0下标空着不用即可!    实际上数组dData有14个元素...
  • sql数组

    千次阅读 2018-08-27 11:15:58
    在利用SQL对数据库进行操作时,有时就想在SQL使用数组,比如将1,2,3,4,5拆分成数组。可惜的是在T-SQL中不支持数组。不过还是有变通的办法。我们可以自己编写两函数Get_StrArrayLength(取得字符串的长度-元素的个数)...
  • 数组下标为什么是0开始

    千次阅读 2021-02-25 12:55:25
    数组的 4 个基本元素:数组名称、数组元素...C语言数组下标是0开始->Java也是->JavaScript也是。降低额外的学习和理解成本。 原因二:减少CPU指令运算 ①下标0开始数组寻址:arr[i] = base_addre...
  • 分析起来还是挺有味道的,书上的文字描述看起来有点杂乱,然后上网查就更懵了,b站啊各种论坛啊,写的人多但是会发现他们之间有一些不一样,我觉得区别就在于那个数组下标到底是0还是从1开始的、、、 现在说一下我...
  • 写在前面:博主是一位普普通通的19届二本大学生,平时最大的爱好就是听听歌,逛逛B站。博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想...模式串下标1开始的next数组求.
  • c语言中数组的下标什么开始

    千次阅读 2021-05-20 06:26:58
    c语言中数组的下标0开始。数组中的各元素的存储是有先后...C语言中数组的元素下标为什么0开始,而不是从1开始例如“int a[5];”表示定义了有 5 个元素的数组 a,这 5 个元素分别为 a[0]、a[1]、a[2]、a[3]、a[4]...
  • 数组特性 数组的一大特性:随机访问,这个在实际开发中大家也经常使用到。 数组地址 如何理解随机访问?假设有个数组int a[10],它的起始地址值为0x1000(address),那么当你访问第n个数据时(即a[n]),实际上是...
  • 数组的下标为什么0开始

    千次阅读 2019-01-12 14:11:34
    从数组存储的内存模型上来看,“下标”最确切的定义应该是“偏移(offset)”。如果用a来表示数组的首地址,a[0]就是偏移为0的位置,也就是首地址,a[k]就表示偏移k个type_size的位置,所以计算a[k]的内存地址只需要...
  • Excel VBA基础语法——数组(四)

    万次阅读 2018-08-06 14:20:11
    在声明变量的过程中会出现一次性需要声明多个同类型变量的情况,如果还是按照常规的方法,那么程序就比较杂乱,为了一次性声明多个同类型变量,引入了数组的概念。数组就是同类型多个变量的集合,也是变量。数组声明...
  • 数组下标为什么0开始:a.初步理解:b.加深理解: 1.数组的由来: // 变量声明 int a = 1; int b = 2; int c = 3; int d = 4; ... int n = 20; // 一个int类型4个字节,一个字节占8位 a.字面引申: ...
  • 前端基础——数组的方法

    万次阅读 2018-12-29 00:38:37
    push() 在数组末尾添加元素,接收一个或多个参数 unshift() 在数组首位添加元素,接收一个或多个参数 pop() 删除数组末尾元素 shift() 删除数组第一个元素 splice() 在任意位置添加或删除元素。原数组发生改变,返回...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,728,884
精华内容 691,553
关键字:

数组从1开始