c++ 不能分配给为0的数组_【嵌入式C】你有想过quot;数组下标quot;为何从0开始吗?...

f21802e631ae6fa89b93e6ab35e39ddf.gif

1、聊一聊

相信大家都有看过电影,今天所分享的是其经典背景音乐,或许音乐响起你又会想起那条单纯、善良的秋田犬!

     今天跟大家聊聊一个有意思的话题,C中的数组下标为啥是从0开始?或者说为什么现在大部分的编程语言都会选择从0开始索引!本文将从三个方面展开这个话题。

c1d844f490d9be26d72497b9b6d80751.png

2、话题引出

40c7b753171053dec93c20df3ef9307a.png3fce48db85faf7d70d9c860dd6ba5249.png

凯爷,你见过数组下标从1开始的编程语言吗?

额~ ,我想想,似乎好像matlab的数组是从1开始的。

97ca4683988fdd8381b670d72ab30408.pngb0e45e96cabcb8cb0609b95aad0bba5c.png40c7b753171053dec93c20df3ef9307a.png3fce48db85faf7d70d9c860dd6ba5249.png

不会吧,感觉数组用1开始的编程语言很少吧!那为什么都是从0开始呢?1开始不是很好吗?

我在有些书上看过类似的解释,从0开始设计上会方便很多,应该也有一定的历史原因吧。管那么多干嘛,怎么规定怎么用就好了呀!

97ca4683988fdd8381b670d72ab30408.pngb0e45e96cabcb8cb0609b95aad0bba5c.png40c7b753171053dec93c20df3ef9307a.png3fce48db85faf7d70d9c860dd6ba5249.png

确实意义倒不大,不过我还是有些好奇,毕竟我是靠C吃饭的!

b29e04bc714f687cafeb0620173f6298.png40c7b753171053dec93c20df3ef9307a.png5fad882e5b754e863c18b87b0b3b9574.png

bug菌,你知道数组下标为何从0开始吗?

这个问题有点难为我了,毕竟我不是语言考古学家,不过我可以跟你聊聊我的一些想法,参考一下!

213f95de81561207cef3b5c3fc741e6e.png22953973e0e5e01698c3fbda05f7c741.png

1

惯性思维 

  • 从我们开始学习数数,并且用手指头开始比划着的时候,大人们就会教我们"1、2、3、4。。。。。。"一共10根手指。同样,当我们去别人家做客,然后问楼层的时候,也是第1层、第2层。。。,最多也就有个-1或者-2层,并没有说0层等等。

  • 于是,生活中这些从1开始计数的方式顺理成章的就会让我们形成一种凡事都从1开始的惯性思维,而当我们开始学习C编程却发现数组、计数等等都是从0开始的,最开始还不怎么习惯,硬着头皮久而久之也就适应了。

  • 其实生活中也是存在非常多从0开始标识的变量,比如下面的尺子,其测量长度就是从0开始的,同样时钟也是从零开始计时。

4087471ae0b354bd2de63f5389a472ce.png

477a2e3476268ec90bc7265369443b40.png

  • 于是大体可以找到一丝共性,从0开始的标识方式大部分都是为了表征一种距离和偏移量,而从1开始标识则是为了表征个体数量等等。

2

简化运算与编译器

  • 此观点应该是大部分教科书所表达的,C语言的精髓当然属于指针了,而指针的索引采用的就是一种偏移的概念。

  • 比如我们经常使用的ptr + 4 的地址为: ptr_Addr + 4*sizeof(type),当使用指针去索引数组Array[10],则用ptr指向数组头Array,理所当然*(ptr + 4) = Array[4];也可表示为 Array + 4*sizeof(type),从而指针的偏移刚好等于数组下标。

  • 如果Array数组从1开始标识*(ptr + 4) = Array[5];这样一方面不便于我们代码上理解,很容易忘记+1或者-1;另外一方面对于编译器解析代码还需要进行-1操作,势必会加长编译时间。

  • 所以Array从0开始标识也是为了与指针的偏移概念对齐,可以说数组下标表征的就是偏移量,而非标识的第一个元素!

3

终极底层思想

  • 除了C语言,现在大部分编程语言都是用0开始标识数组,比如C++,JAVA等等,这些相对后起的语言大多是为了延续着C的风格和习惯,或者是借鉴C的优点,这样一方面便于程序员更加自然的在多种编程语言中分析解决问题,另一方面为多种语言之间的相互调用、融合也会带来便利。

  • 不过如果仅仅只是一种迁就那终将被时代所抛弃,回首看看有多少编程语言在程序员的指尖溜走,而C现在都四五十岁了,仍然保持着活力,对于数组从0开始标识当然也是容不得半点马虎的。

  • C语言的特色在于它可以灵活的控制底层硬件却又保持着高级语言的易用和易懂属性,所以它算是一门非常接近底层硬件的语言。

  • 然而芯片可供程序员的控制操作大部分都是数字电路的组合,那么0/1电平,定时器的计数、系统寄存器、存储器的初始化状态值等等,均为0开始编码,既然C作为一门与底层非常亲近的语言,能够对硬件进行一种数据的抽象是一个非常自然的设计,这样就可以避免非常多用1开始标识而需要重新对齐的问题。

40c7b753171053dec93c20df3ef9307a.png3fce48db85faf7d70d9c860dd6ba5249.png

bug菌,第三点我真的太赞同了!

我仿佛又吹了一波C语言的牛!

97ca4683988fdd8381b670d72ab30408.png22953973e0e5e01698c3fbda05f7c741.png

3、结束语

     做为一名多年的C爱好者,以上就是个人对该问题的一些理解了,最终答案还是由C语言考古队来发表吧。

    好了,这里是公众号:“最后一个bug”,一个为大家打造的技术知识提升基地,如果你喜欢交流可以添加下方bug菌微信,我拉你加入公众号技术交流群。

d641f4031ce2f3c74b2dd9e2ae2ec677.png

推荐好文  点击蓝色字体即可跳转

☞【开源】bug菌把"动态数字显示"开源了!ab891eb67ca0d7695acdf2bc36608583.gif

☞【MCU】可怕,别人把我MCU固件给反汇编了!(逆向)ab891eb67ca0d7695acdf2bc36608583.gif

☞ 【程序人生】学不到东西,不想呆在这家公司了!

☞ 【C进阶】"最常见"却又"最不常用"的三个预编译

452d1f83ae436cb37832dce4aac29e4e.gif

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

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

相关文章

2018.9.19.Matlab实验四:Matlab程序设计

一、实验任务和目的 熟悉程序设计思想。掌握伪代码的编写方法。掌握分支语句和循环结构的用法。 二、实验内容 输入一个百分制成绩,要求输出成绩等级A、B、C、D、E,其中90-100为A,80-89为B,70-79为C,60-69为D&#…

sata接口 图解 定义_SATA协议简介

SATA协议简介1、概述本文档主要介绍SATA的发展历程以及SATA相关协议,为后续SATA驱动框架分析做基础知识准备。2、SATA简介2.1 SATA发展历程2.1.1 PATA硬盘PATA硬盘叫做并行ATA硬盘(Parellel ATA)。为了限制其信号放大系统产生的高噪声,常采用高达5V的电压…

30岁软件测试转产品_SENSORO 产品总监回特入选 2019 年福布斯中国 30 岁以下精英榜...

日前,福布斯中国发布 2019 年度 30 岁以下精英榜(30 Under 30),SENSORO(北京升哲科技有限公司)产品总监回特 成功入选 U30 精英榜企业科技版块。福布斯中国表示,今年技术领域人才辈出&#xff0…

pagehelper插件oracle,带你学习最简单的分页插件PageHelper

引言:PageHelper是国内非常优秀的一款开源的mybatis分页插件,它支持基本主流与常用的数据库, 例如mysql、 oracle、mariaDB、 DB2、 SQLite、Hsqldb等。今天墨白就给大家聊聊PageHelper这款分页插件,下面是PageHelper开源地址,感兴趣的小伙伴可以去看一下…

实验5matlab自定义函数的编写

问题 自定义一个函数,求给定复数的指数、对数、正弦和余弦,并在命令文件中调用该函数。自定义一个函数,计算一行向量中各元素的均值和标准差。求下列方程的根: f(z)exx2xx100.f(z) \ e^{x}x^{2}x^{\sqrt {x}}100\,. f(z) exx2xx…

ic读卡器设置工具_从Matlab被禁来看,给IC教育带来哪些启发?

在上周五看到朋友圈转发包云岗老师就Matlab被禁后在某论坛的发言,在阅读的当时就很有感触,本想当晚就写点东西,不曾想拖到了现在。包老师的梳理的几个点,是结合教学和应用来谈的。在IC教育培训方面,我对这些观点也深以…

arduino光敏+LED+数码管+蜂鸣器综合实验

内容 用光敏控制LED的明暗程度,光敏值在3位数码管上显示,串口输出光敏值,蜂鸣器到一定的值会didi 话不多说,直接上代码,那几个部分拼到一起,多了个数的拆分,让k1k2k3分别等于百位十位个位 代…

server sql 水平分表_springboot集成Shardingsphere进行分库分表

当公司业务量上去之后,单表支撑不了的时候,分库分表就是一个绕不开的话题,小弟最近新入职一家公司,发现这边公司在用ShardingSphere来进行分库分表,之前没接触过这方面,所以就写了个demo学习一下&#xff0…

网鼎杯2020php反序列化,2020-网鼎杯(青龙组)_Web题目 AreUserialz Writeup

0x02 AreUSerialz关于s大写小写问题,可以看p神在圈子里发的,我在最后付上截图考点: php反序列化 php特性 利用链构造1.打开页面得到代码如下:include("flag.php");highlight_file(__FILE__);class FileHandler {protected $op;protected $file…

利用matlab绘制图形

目前存在的一些问题: 1.第一题的两个图像无法重叠 2.最后一个题的第一个图是六瓣,而我写的是八瓣 感谢张同学给我指出来,目前我正在思考解决方法 第一个的话我以为把框缩小就可以重叠了,但是今天试了一下还是分开的,还…

matlab guide对话框+滑动条+弹出式菜单+列表框的使用

文章目录前言matlab数据传递概观对话框创建利用滑动条实现颜色调控利用弹出式菜单选择并输入文本框利用列表框选择并输入文本框前言 我觉得gui无非就是给程序加了件衣服,其实具体的程序我们都会写,我们唯一不明白的是那几个部分数据之间的传递&#xff…

流放之路材质过滤怎么设置_松下除湿机怎么样 松下除湿机款式有哪些型号【详解】...

马上南方就要进入梅雨季节了,潮湿的天气容易滋生细菌,可能会导致人们出现过敏现象,所以很多家庭都选择购买除湿机,现在市场上的除湿机不是很多,其中松下的除湿机比较受欢迎,所以小编我就来跟大家说一说松下…

matlab图形句柄+图形对象+图形对象的属性+对象操作

文章目录前言:图形对象:图形句柄:图形对象的属性:对象的基本操作figure对象(图形窗口)figure()函数:clf()函数清空当前图形窗口:axes坐标轴对象image()line()text()前言: 下面这些是为了更好地…

echart 高度 不用 不撑满_注意厨房台面高度及细节 装出省心舒服 装出事半功倍...

厨房的装修设计最好还是细节做得好,细节做得能达到事半功倍的效果,厨房台面高度如何设计才是最合适呢?我们一起走进包头装修网了解一下吧!下面三个台面的设计细节,也许就能让你家的厨房突然变得好用起来——哪怕你可能…

利用matlab guide制作简易计算器

前言: 当然了这个太简单了,新手可以借鉴一下,举一反三的话还可以添加一些功能或者简洁一些。比如下拉框啊之类的 而且呢,这个你弄明白了,所有运算有关的,输入输出有关的,都大致相同。 实现过程…

linux复制目录命令夹,linux复制目录(文件夹)和打包命令

linux复制目录(文件夹)和打包命令复制目录命令: cp 需要复制的目录 -r 目的目录 (注意带参数-r)压缩文件:zip -r 压缩后文件名 需要压缩的目录喎?http://www.Bkjia.com/kf/ware/vc/" target"_blank" class"keylink">vcD4KP…

c#怎么拟合函数得到参数_吴恩达老师课程笔记系列第32节 -正则化之代价函数(2)...

第32节 -正则化之代价函数(2)参考视频: 7 - 2 - Cost Function (10 min).mkv 上面的回归问题中如果我们的模型是:我们可以从之前的事例中看出,正是那些高次项导致了过拟合的产生,所以如果我们能让这些高次项的系数接近于 0 的话,我…

Matlab guide菜单+快捷菜单的使用

菜单选择: Opening函数: openingFcn执行于窗口可见之前,这个时候你想做什么的话可以把代码写进去 function plott_OpeningFcn(hObject, eventdata, handles, varargin) t1/200:1/200:1; plot(t,sin(2*pi*t*10),r);几个回调函数: …

c向文件中插入数据_如何把数据写入顺序文件中,VBA代码中Write#语句的利用

大家好,我们今日继续讲解VBA代码解决方案的第132讲内容:使用 Write #语句把数据写入打开顺序文件中。在上一讲的内容中我们讲了打开一文本文件来写入数据的两种方法有:Append或Output,那么问题来了,如何往打开的文件中…

JavaScript变量声明+数据类型+数字格式+操作符+进制

文章目录1.那些高大上的概念术语都是指什么什么是web应用?什么是前台后台?怎么做网页界面呢?JavaScript可以应用到什么上面?2.JavaScript实例:3.语言基础变量声明数据类型基本数据类型:引用数据类型&#x…