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,一经查实,立即删除!

相关文章

oracle解析md5,Oracle中的MD5加密详解

一、技术点1、 DBMS_OBFUSCATION_TOOLKIT.MD5DBMS_OBFUSCATION_TOOLKIT.MD5是MD5编码的数据包函数,但偶在使用select DBMS_OBFUSCATION_TOOLKIT.MD5(input_string >abc) a from Dual时,却有错误提示,看来该函数只能直接在程序包中调用&…

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的电压…

oracle 修改2个表,oracle学习笔记2:创建修改表

1.创建表CREATE TABLE ORDERINFO(ORDERID NUMBER(*, 0) NOT NULL, ORDERCODE VARCHAR2(20 BYTE) NOT NULL, USERID NUMBER(*, 0) NOT NULL, MOBILEPHONE VARCHAR2(20 BYTE) NOT NULL, ADDRESS VARCHAR2(128 BYTE) NOT NULL, PRODUCTNUMERIC NUMBER(*, 0) DEFAULT (0) NOT NULL,…

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

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

Arduino实现数码管动态显示

之前一直以为公共端要么是解地要么是接电源(3.3或5v),但是今天弄了半天我发现只要接口有电位差即可 没听课导致课堂作业没写出来,回来调了两个小时才完成 题目: 三位数码管从01亮到99,用arduino实现 分析…

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教育培训方面,我对这些观点也深以…

oracle数据库主键消失,oracle数据库提示找不到主键

杨泽public class Info {AssignIDString node;String name;}infoDao.single("000001");org.beetl.sql.clazz.kit.BeetlSQLException: 主键未发现,com.hcjj.demo.Info,检查数据库表定义或者NameConversionat org.beetl.sql.core.db.AbstractDBStyle.checkId(AbstractD…

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…

物理实验数据处理(c语言)

看程序应该能看懂怎么输入&#xff0c;我就不写具体输入什么了 1.转动惯量的测定 1.不同物体的摆动周期 #include<iostream> #include<cmath> using namespace std;int main(){double pi3.14,jzhi0.187e-4,jjia0.321e-4;double t0,t1,t2,t3,t4,t5;double k,j1,j…

统计csv词频_分词词频统计

网上随便找段文字&#xff0c;就以Power BI官网上这段文字为例好了&#xff1a;想要统计其中的词频&#xff0c;实现如下图的效果&#xff1a;解法1&#xff1a;使用输入法词库其中的难点无疑在分词了&#xff0c;中文不像英文可以按空格拆开分词&#xff0c;仅仅单靠Power Que…

linux 开启关闭tomcat服务器端口,linux系统安装、启动和关闭tomcat

Tomcat 可充当一个完全独立的 web 服务器。Tomcat 最大优势在于 servlet 和 JSP 引擎。安装 tomcat:Sudo yum install -y tomcat-*启动 tomcat:[userlocalhost ~]$ /etc/rc.d/init.d/tomcat start[userlocalhost ~]$[userlocalhost ~]$ /etc/rc.d/init.d/tomcat status[userloc…

利用matlab绘制图形

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

haddler处理队列 netty_Netty堆外内存泄漏排查,这一篇全讲清楚了

上篇文章介绍了Netty内存模型原理&#xff0c;由于Netty在使用不当会导致堆外内存泄漏&#xff0c;网上关于这方面的资料比较少&#xff0c;所以写下这篇文章&#xff0c;专门介绍排查Netty堆外内存相关的知识点&#xff0c;诊断工具&#xff0c;以及排查思路提供参考现象堆外内…

linux 硬盘大小 命令,linux 查看磁盘空间大小的命令和方法

这篇文章主要为大家详细介绍了linux 查看磁盘空间大小的命令和方法&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴。1.Ubuntu 查看磁盘空间大小命令df -h Df命令是linux系统以磁盘分区为单位查看文件系统&#xff…

matlab GUI 设计 自学笔记

图形用户界面&#xff08;Graphical User Interface&#xff0c;GUI&#xff09;&#xff1a; 用户与计算机进行信息交流的窗口。 设计图形用户界面的方法 调用建立用户界面控件的函数 使用MATLAB提供的GUIDE工具进行可视化设计 控件对象及其操作 &#xff08;1&#xff09…