为什么数组开头是0而不是1呢?
最近在学操作系统里有关进程的并发和互斥已经同步问题,在研究经典同步问题“哲学家进餐”时,刚准备写思路就遇到一个我学了3个月计算机专业竟然现在才想解决的问题(说来惭愧,,现在大二下,大二上刚转专业到软件工程),为什么数组下标要从0开始(经本人实践,碰上这种不知道谁开头的真的0开头超级好使啊啊啊啊)
第一种解释:
在编程语言的历史中C->Java->JavaScript的顺序出现的,C的数组下标从0开始。所以后面都是从0开始,降低学习成本。。。。。。
(ps:显然这个回答完美的解决了我的问题!!!!)
第二种解释:
在C语言中,下标的含义是:当前元素到第一元素的偏移量。
- 第一个元素的下标自然是0;
- 第二个元素的下标自然是1;
- 第n个元素的下标为n-1;
我们知道数组是存储在连续的内存空间中(不知道的复习这迷人的基础!)
c语言的编译器通过第一个元素的地址(数组地址),和对应元素的下标(上面所说的偏移量)就可以得到他的地址。(寻址)
数组寻址:arr[i] = first_address + i * tpye_size(1)(ps:不懂这个公式的去恶补这迷人的数据结构!!)
可如果下标从1开始:寻址就变成了“arr[i] = first_address + (i-1) * type_sizr(1)
比较发现每次寻址cpu多执行了一条i-1的指令,但是对于数组这样的基础数据结构,无论哪种高级语言中,都是频繁间接或直接被使用的,因此要尽量减少消耗cpu的资源。
请问以上两种和哲学家有什么关系啊!
下面这种是来自同班大佬告诉:(ps:我果然是衬托大佬的绿叶。。。。哭唧唧.jpg)
在哲学家问题中,一张圆桌上面有5个哲学家如果把任意一个标号从0开始,然后按顺序一次排序到4,当走完一圈时想要在计数就要进行模运算(不知道的小伙伴今天看书到4点!后天的4点!)
这时候加1除模你就会惊奇的发现她就成了第一个数的下标“0”
(4+ 1)/ 5 = 0;
于是这样就完美的解决了小白问题!默默感谢大佬!
ps: 咳咳,好了解决完这个数组问题我终于可以愉快的画一个一桌子哲学家吃饭的图了!开心.jpg
小白写文章。。。如果有错的希望大家帮忙斧正
以上内容参考各大百度谷歌博客总结,侵权联系立删