首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么不从0开始定义多维数组呢?

从0开始定义多维数组是一种常见的编程习惯,特别是在C语言及其衍生语言中。这种习惯源于C语言数组的内存布局和索引方式。

在C语言中,数组的内存布局是连续的,每个元素占据相同大小的内存空间。数组的索引是从0开始的,即第一个元素的索引为0,第二个元素的索引为1,以此类推。这种索引方式与数组的内存布局相吻合,使得通过索引计算元素的内存地址更加简单和高效。

因此,从0开始定义多维数组可以保持一致性和简洁性。例如,对于一个二维数组arr,可以通过arr[i][j]来访问第i行第j列的元素,其中i和j的取值范围都是从0开始的。

虽然从1开始定义多维数组在某些编程语言中也是可行的,但这会导致索引计算和内存访问的复杂性增加。此外,从0开始定义多维数组已经成为了一种广泛接受的编程习惯,许多编程语言都采用了这种方式。

在云计算中,多维数组的定义方式并不会受到影响,因为云计算更关注的是计算和存储资源的弹性和可扩展性,而不是编程语言的细节。无论是从0开始还是从1开始定义多维数组,在云计算中都可以灵活应用。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么数组都是从0开始编号

数组 数组两个特性 为什么数组都是从 0 开始编号,首先先了解一下数组的概念。 数组 Array 是一种线性表数据结构,是一组连续的内存空间,用来存储一组具有相同类型的数据。...int arr[10] = { 0 }; for (int i = 0; i < 10; i++) { arr[i] = i; } 运行结果如下, image.png 从运行结果可以看出,计算机给数组...在 C 语言中数组名代表首地址,即第一个元素的地址,a[0] 就是偏移为 0 的位置,a[k] 就表示偏移 k 个元素类型大小的位置。...得出计算公式: a[k]_address = base_address + k * type_size 结论 如果数组编号从 1 开始计数,那这个公式就会变为: a[k]_address = base_address...+ k * type_size a[k]_address = base_address + (k-1) * type_size 对比两个公式,如果从 1 开始编号,每次随机访问数组元素就多了一次减法运算

1.1K30

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

首先,我们来复习下数组定义 数组是一组连续内存空间存储的具有相同类型的数据,整个排列像一条线一样,是一种线性表数据结构。 ? 那么,问题来了,数组的下标为什么要从 0 开始?从 1 开始行不行?...端好你的小茶杯,开始进入正题 数组之所以广泛使用,是因为它支持随机访问。 什么叫随机访问? 数据在内存中都是按顺序存放的,通过下标直接触达到某一个元素存放的位置。 ?...【0】位置的 `微` ② 读取上面数组的 【9999】位置的 `注` 由于基于计算的内存地址读取数据,上面两种情况的耗费的时间是一样,时间复杂度为 O(1) 注意:想要使用随机访问,一定要满足两个条件...突然,一个奇怪的念头冒了出来,假如我们将数组的首个下标从 1 开始 ,会怎么样? ?...现在再有一分钱,你还会捡吗,估计很多人都看不上眼,但要是全国人民每人给你一分钱 14亿 * 1分钱 = 1400万 人民币 ? 是不是可以立马辞职,回家躺平了!

86320

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

C语言数组下标是从0开始->Java也是->JavaScript也是。 降低额外的学习和理解成本。...原因二:减少CPU指令运算 (1)下标从0开始数组寻址——arr[i] = base_address + i * type_size(1) 其中base_address为数组arr首地址,arr[0...]就是偏移量为0数组,即数组arr首地址;i为偏移量,type_size为数组类型字节数,比如int为32位,即4个字节。...(2)下标从1开始数组寻址——arr[i] = base_address + (i -1)* type_size(2) 比较两个计算公式可以发现公式(2)每次CPU寻址需要多一次 i-1的操作,即多了一次减法的指令运算...原因三:物理内存的地址是从0开始的 计算机主存是多个连续字节大小的单元组成的数组,每个字节都对应唯一的物理地址,第一个字节的地址为0

86020

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

C语言数组下标是从0开始->Java也是->JavaScript也是。 降低额外的学习和理解成本。...原因二:减少CPU指令运算 (1)下标从0开始数组寻址——arr[i] = base_address + i * type_size(1) 其中base_address为数组arr首地址,arr0...就是偏移量为0数组,即数组arr首地址;i为偏移量,type_size为数组类型字节数,比如int为32位,即4个字节。...(2)下标从1开始数组寻址——arr[i] = base_address + (i -1)* type_size(2) 比较两个计算公式可以发现公式(2)每次CPU寻址需要多一次 i-1的操作,即多了一次减法的指令运算...原因三:物理内存的地址是从0开始的 计算机主存是多个连续字节大小的单元组成的数组,每个字节都对应唯一的物理地址,第一个字节的地址为0。 微信公众号:技术很有趣 公众号二维码.jpg

3.2K60

数组为什么很多编程语言中数组都从0开始编号?

数组本身在定义的时候需要预先指定大小,因为需要分配连续的内存空间。...,是不是数组就无用武之地了?...如果数据大小事先已知,并且对数据的操作非常简单,用不到 ArrayList 提供的大部分方法,也可以直接使用数组。 还有一个是我个人的喜好,当要表示多维数组时,用数组往往会更加直观。...但如果你是做一些非常底层的开发,比如开发网络框架,性能的优化需要做到极致,这个时候数组就会优于容器,成为首选。 为什么大多数编程语言中,数组要从 0 开始编号,而不是从 1 开始?...至于为什么0开始,猜想 一是因为C语言和很多语言都是从0开始,为了学习成本数组也从0开始

91930

数组 为什么数据可以随机访问?为什么数组下标都是从0开始

数据结构 – 数组 概念 数组是一种线性表数据的结构,他用一组连续的内存空间,来存储一组相同数据类型的数据。 线性表:数据排列成一条线一样的结构。...相同的数据类型:相同的数据类型,换句话可以说数据存储所占用内存大小一样 特性 - 随机访问 基于上面的概念描述,下面来分析一下数组的最大特性:随机访问 非随机访问:就是存取第N个数据时,必须先访问前(...N-1)个数据 (链表) 随机访问:就是存取第N个数据时,不需要访问前(N-1)个数据,直接就可以对第N个数据操作(数组) 如下图所示: 为什么数组下标都是从0开始?...从上面图示我们来分析: 假设下标为1开始:我们要想获取第3个值得话 首地址(1000)+ (3-1)*4(数据类型占用的内存) = 1008 第三个内存地址的位置 假设下标从0开始:我们想获取第3个值得花

76810

为什么数组下标从 0 开始?而不是 1?

很多小伙伴初学编程的时候都被元素下标折磨过,为什么很多编程语言要把 0 作为第一个下标索引,而不是直观的 1 ?...(上界)大于序列中的最大值 2 不等式左边(下界)小于序列中的最小值,不等式右边(上界)等于序列中的最大值 对于第 2 个不等式来说,下界小于序列中的最小值,这会出现一个问题,比如我们的连续序列是 [0,1,2,3,4...遵循不等式 1 的规则: 当从下标 1 开始时,下标范围 1 ≤ i < N+1 当从下标 0 开始时,下标范围 0 ≤ i < N 哪个更优雅?...Dijkstra 是这样解释的:从下标 0 开始能够给出更好的不等式,因为元素的下标就等于序列中它前面的元素数(或者说 “偏移量”)。 问题解决!

83930

计算机原理:数组下标为什么0开始

为了记数方便 注意这个红色的0,这里是从零开始。 内存地址是从0开始,如果内存上装载一个数据如int类型。 一个int类型是4个字节,那么假设一个int的 data_type_size=4。...那么数据的内存是连续的,那初始化5个数组就是: int[] a = new int[5],到这都很清楚吧。...那么来推一下: 下标:i=0 数组[0]: a[0]_address = base_address + 0 * data_type_size 下标:i=1 数组[1]: a[1]_address...= base_address + 1 * data_type_size 最络结果是这样 i=0 { a[0] } 1000-1003 i=1 { a[1] } 1004-1007 i=2 { a[...减少CPU指令运算 如果下标从1开始,base_address 这种内存地址还是从 1000 开始 下标:i=1 数组[1]: a[i]_address = base_address + (i-1)

15420

为什么编程语言中数组的下标总是从0开始

昨天看到一个有意思的问题,为什么在我们遇到的大多数编程语言里面,数组的下标基本都是从0开始? 这是一个简单的问题,很少人会有人去思考为什么,但这里面其实是有一定的数学逻辑在里面。...像目前主流的编程语言C/C++,Java,JavaScript的数组下标都是以0开始,最后一个位置的index=数组的长度-1,当然也有少数的编程语言如Fortran,声明一个a(10)默认就是从1开始的...,当然你可以指定从0开始,需要换种方式声明a(0:9)。...那么为什么应该从0开始而不是1,这在计算机科学里面是一个有趣的概念。...首先,对于要求1可以包含最小的自然0,我们会发现a和c的标记法是没法表示0的,除非写成-1 for(i=0;i<N;i++){ sum+= a[i]; } 至此你应该了解为什么数组的下标要从0开始

1.9K20

为什么很多编程语言中的数组都从0开始编号?——你真的了解数组吗?

在大部分编程语言中,数组都是从0开始编号的,回想当年初学java,刚接触数组的时候,我就想过,为什么数组要从0开始编号,而不是从1开始?从1开始不是更符合人类的思维习惯吗?...数组为了保持内存数据的连续性,会导致插入、删除这两个操作比较低效。究竟为什么会导致低效?又有哪些改进方法? 我们先来看插入。...”,而是会无限打印“hello world”,这是为什么?...六、为什么数组要从0开始编号,而不是从1开始 CPU性能考虑:从数组存储的内存模型上来看,“下标”最确切的定义应该是“偏移(offset)”。...0 开始计数的习惯。

56820

【深度揭秘】为什么很多语言的数组下标是从0开始的?

很多的编程语言数组都是从0开始的,这已经是常识了。但是你是否好奇的想过,为什么?按照正常人的思维不都是从1开始的吗? 所以,我们带着这个疑问往下看。...,使用数组比使用ArrayList性能更好 定义多维数组时,使用数组更加的直观 如果数据大小事先知道,而对数据的操作比较简单。...但是如果是做比较偏底层的开发就需要关注性能了,性能一丁点的提升,影响也是很广泛的,所以选择数组比较合适。 回到主题 为什么数组0开始?...从数组存储的内存模型来看,下标比较确切的定义是“偏移”,如果用a来表示数组的首地址,那么a[0]就表示偏移为0的位置。a[x]就表示偏移x个类型大小(int 4个字节)的的位置。...0开始而不是从1开始

1K20

数组……Geez,我总是弄混

至于为什么VC从6到9都无法编译这段代码: void main() {    int n = 2;    int arr[n][3];} 大概只是因为对C99支持得不好吧。...MSIL/CIL指令;后者是多维数组或者下标不从0开始数组,其相关操作都通过库方法来完成。...Java只支持锯齿形数组多维数组实际上是数组数组。...Java……理由是一样的但为什么语法规则就是不同…… 说来,最近才注意到LINQv1和LINQv2都不支持矩形多维数组的初始化……NewArrayInit只能用来初始化一维数组,嵌套使用可以初始化锯齿形多维数组...只是在用Python的NumPy库时留意到一段说明,说C的二维数组是行优先存储,而FORTRAN的是列优先存储的,多维同理。另外FORTRAN的数组的下标默认是从1开始的。

74000

Java基础语法(十)数组?不不不,是麻袋,既能装白菜,又能装妹子

文章目录 前言 数组 一维麻袋的定义 怎么往麻袋里面装白菜 怎么取出我需要的白菜 多维数组多维麻袋) 定义一个多维麻袋 往这个多维麻袋里防白菜 按一定规律往每个麻袋放白菜 查看我们放入的是否正确...数组 什么是数组?在Java中,数组就是存储多个相同数据的集合,他们的内存地址是相邻的,所以可以通过数组取值。 这么说,是不是有点不好理解,那么这样?...我有一颗白菜,手拿着就能回家,那如果是十几颗? 我就可以用麻袋!麻袋!装进去,带回家!是的你要存的数据就是白菜,而这个数组就是你要用的麻袋~~~~~ 麻袋中的白菜怎么拿出来我需要用的?...下标,Java中的下标是以0开始的,什么是下标,就是你从0开始查,查到某个你要的数据,查到几,下标就是几,就相当于,我在装白菜的时候,说“这是第0个白菜,这是第1个白菜…”,而他们也能听懂(别管他们能不能听懂...这叫做:多维数组(麻袋里面的白菜,换成了麻袋,然后麻袋里面的麻袋里面装白菜) 定义一个多维麻袋 定义一个里面含有三个麻袋的麻袋,每个麻袋可以装4个白菜 int[][] a = new int[3][4]

81610

撸起袖子加油干 golang入坑系列

Golang的数组从数据结构的角度来说,和其它语言没什么区别。都是链式存储数据,存储相同类型的数据。数组下标同样从0开始计数,通过[]来顺序访问。...= %d\n", j, n[j] ) } } Golang最基本的数组用法就是这些,在开始的时候说过,最常用的是一维数组多维数组使用不算太多(尤其超过二维的数组,用之甚少),因此使用一点篇幅来说一下多维数组的使用...多维数组的初始化和一维一样(其实我们可以将多维数组降维成一维),看下面: var a = [3][4]int{ {0, 1, 2, 3} , {4, 5, 6, 7} ,...所以这个数组的初始化,就是同时完成多个数组的初始化。 多维数组的访问,仍然遵循下标访问的规则。 例如需要取出上面数组中的8,那就是 a[2][0]。...这点是刚开始写golang代码时容易混淆的地方,[5]int是数组类型,而[]int则是切片类型。因此会报错。 在实际编程经验中,数组使用率反而不如切片高。这又是为何

48250

Golang中的map数据类型

例如下面的代码: // 索引数组数组的key是一个数字, 从0,1,2开始递增】 $array = [1, '张三', 12]; // 关联数组数组的key是一个字符串,可以自定义key的名称】 $...slice := []int{1, 2, 3, 4}有数组和切片可以存储一组数据,那为什么还有map这样的类型结构?map类型具体是啥样的?...一个用户一个变量,如果存在千万个用户,我们岂不是需要定义千万个变量。 c. 繁琐。相比PHP的实现,是不是非常繁琐。PHP中直接定义一个变量,通过多维数组的方式,就可以定义key和值。清晰并且简单。...这也是为什么大家都说PHP中的数组非常强大和好用了。 通过切片和数组实现的方式,我们知道了弊端。那有不有一种数据类型能够像PHP这样简单就能实现?这样的场景就可以用map实现PHP这样的定义结构。...因为是多个用户,我们是不是需要定义多维的map结构。 map的一级key是int,表示当前的用户序号(从0,1,2,3...依次递增)。

1.4K10

重读《学习JavaScript数据结构与算法-第三版》- 第3章 数组(一)​

= ['鲁班', '吕布', '王昭君', '蔡文姬', '孙悟空'] 推荐使用[]定义数组 数组索引 数组的索引从0开始,依次累加; 数组索引的最大值为数组的长度-1; 每个数组的值都对应了一个数组的索引...('第一位英雄:' + heros[0]) // 凯 迭代数组 此处我们使用高大上的名词迭代,拒绝低调的遍历,不要问我为什么!...自定义实现数组开头插入元素的方法 实现逻辑思考:在数组的开头插入一个元素,需要空出数组第一个元素的位置,将所有的元素都向右移动一位 Array.prototype.insertFirstPosition...如包含1000个元素的数组,在数组索引0位置插入一个元素,需要移动1000个元素,性能肯定不好 追问:如何优化? 答:采用JS的链表结构 --- 啥是链表结构,请看持续关注公众号文中呦......(heros[0][1]) // 女娲 // 多维数组 heros = [ [ ['甄姬', '安琪拉'] ], [ ['操作', '夏侯惇'] ] ] // 多维数组取值

48121

Golang中的map类型都在哪些场景下使用

例如下面的代码: // 索引数组数组的key是一个数字, 从0,1,2开始递增】 $array = [1, '张三', 12]; // 关联数组数组的key是一个字符串,可以自定义key的名称】...slice := []int{1, 2, 3, 4} 有数组和切片可以存储一组数据,那为什么还有map这样的类型结构?map类型具体是啥样的?...一个用户一个变量,如果存在千万个用户,我们岂不是需要定义千万个变量。 c. 繁琐。相比PHP的实现,是不是非常繁琐。PHP中直接定义一个变量,通过多维数组的方式,就可以定义key和值。清晰并且简单。...这也是为什么大家都说PHP中的数组非常强大和好用了。 通过切片和数组实现的方式,我们知道了弊端。那有不有一种数据类型能够像PHP这样简单就能实现?这样的场景就可以用map实现PHP这样的定义结构。...因为是多个用户,我们是不是需要定义多维的map结构。 map的一级key是int,表示当前的用户序号(从0,1,2,3...依次递增)。

1.3K30
领券