服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 浅谈C语言数组元素下标为何从0开始

浅谈C语言数组元素下标为何从0开始

2022-08-14 10:34bufanq C/C++

很多同学可能在学习数组时会有这个疑问,下标为什么不从1开始呢?本文主要介绍了浅谈C语言数组元素下标为何从0开始,感兴趣的可以了解一下

    很多同学可能在学习数组时会有这个疑问,下标为什么不从1开始呢?从1开始不是更符合大家的日常习惯吗?生活中我们通常说第1个,而不是第0个。的确,有些计算机语言如早期的Pascal语言,数组元素的下标是从1开始的。难道是C语言故意要与众不同?要弄清楚这个问题,得先看一下计算机底层是怎样处理数组元素的。我们先编写了一个小程序,然后在visual studio中对其进行了反汇编。源程序和反汇编后的部分代码如下:

源程序:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int arr[5];  //一个全局数组
 
int main()
 
{
   int i;
 
   for (i =0;i < 5;i++)
 
      arr[i] = 9;
 
   return 0;
 
}

反汇编后的部分代码:

int i;

for (i = 0; i < 5; i++)

0101168E

C7 45 F8 00 00 00 00

mov dword ptr [ebp-8], 0

01011695

EB 09

jmp 010116A0

01011697

8B 45 F8

mov eax, dword ptr [ebp-8]

0101169A

83 C0 01

add eax,1

0101169D

89 45 F8

mov dword ptr [ebp-8],eax

010116A0

83 7D F8 05

cmp dword ptr [ebp-8],5

010116A4

7D 10

jge 010116B6

arr[i] = 9;

010116A6

8B 45 F8

mov eax,dword ptr [ebp-8]

010116A9

C7 04 85 80 95 01 01 09 00 00 00

mov dword ptr [eax*4+01019580h], 9

010116B4

EB E1

jmp 01011697

return 0;

010116B6

33 C0

xor eax,eax

    上表中除了程序源代码,其它部分中,最左列是指令的地址,中间是机器码,也就是机器最后执行的代码,右列是对应的汇编语言代码。可能初学者看不懂这些汇编代码,没有关系。我们重点看一下这一句:mov   dword ptr [eax*4 + 01019580h] , 9 它的功能就是arr[i] = 9,其中eax中存放着变量i的值,4表示每个元素占4个字节,01019580h是数组arr的首地址,为了确认,可以在监视窗口中键入arr或者&arr[0],我们可以看到它们的值等于0x01019580h,如下图所示:

浅谈C语言数组元素下标为何从0开始

    也就是说,在给第i个元素赋值时,先要计算它的地址,即:首地址+i*4,在这个例子中,首地址是01019580h,所以第0个元素存放在以01019580h 开始的四个字节中,第1个元素存放在以01019584h 开始的四个字节中,…,第4个元素存放在以01019590h 开始的四个字节中。计算出地址后,用mov指令将9传递到该地址开始的4个字节中存放。执行完for循环后,查看01019580h开始的内存情况,如下图所示:

浅谈C语言数组元素下标为何从0开始

    可以看到,以0x01019580h开始的连续20个字节中存放着5个9。

    从上面看出,当数组元素下标从0开始时,每个元素的地址计算如下:

                              第0个元素地址:首地址 (首地址 + 0*4)

                              第1个元素地址:首地址 + 1*4

                              第2个元素地址:首地址 + 2*4

                                …

                            第i个元素地址:首地址 + i*4

    当数组元素下标从1开始时,每个元素的地址计算如下:

                              第1个元素地址:首地址

                              第2个元素地址:首地址 +(2-1)*4

                              第3个元素地址:首地址 +(3-1)*4

                                …

                            第i个元素地址:首地址 +(i-1)*4

    很明显,如果数组元素下标从1开始,每次计算地址时,需要多做一次减法操作。因此,为了提高效率,C语言数组元素下标从0开始。C语言的高效率就是体现在这些点点滴滴中的,需要在学习中慢慢体会!

到此这篇关于浅谈C语言数组元素下标为何从0开始的文章就介绍到这了,更多相关C语言数组元素下标从0开始内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/bufanq/article/details/51330197

延伸 · 阅读

精彩推荐
  • C/C++C语言代码实现简易三子棋游戏

    C语言代码实现简易三子棋游戏

    这篇文章主要为大家详细介绍了C语言代码实现简易三子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    小甜包11822021-11-04
  • C/C++C++实现LeetCode(85.最大矩形)

    C++实现LeetCode(85.最大矩形)

    这篇文章主要介绍了C++实现LeetCode(85.最大矩形),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    Grandyang11672021-11-30
  • C/C++C语言实现支持动态拓展和销毁的线程池

    C语言实现支持动态拓展和销毁的线程池

    这篇文章主要为大家介绍了C语言实现支持动态拓展和销毁的线程池,感兴趣的小伙伴们可以参考一下...

    C语言教程网6632021-03-19
  • C/C++VC6.0常见链接错误与解决方法

    VC6.0常见链接错误与解决方法

    这篇文章主要介绍了VC6.0开发中一些常见链接错误的解决方法,需要的朋友可以参考下...

    C语言教程网3552020-12-18
  • C/C++VS2019中在源文件中如何使用自己写的头文件

    VS2019中在源文件中如何使用自己写的头文件

    通过头文件的形式直接调用自定义的函数,从而免去对函数的原型进行声明,本文就详细的介绍一下VS2019中在源文件中如何使用自己写的头文件,感兴趣的...

    落春只在无意间9132022-01-04
  • C/C++C++ Opencv imfill孔洞填充函数的实现思路与代码

    C++ Opencv imfill孔洞填充函数的实现思路与代码

    在Matlab下,使用imfill可以很容易的完成孔洞填充操作,下面这篇文章主要给大家介绍了关于C++ Opencv imfill孔洞填充函数的实现思路与代码,文中通过示例代码介...

    LYK_DoDo10382022-01-12
  • C/C++C++基础概念讲述

    C++基础概念讲述

    这篇文章主要介绍了C++基础概念,​ 本次为C++的一个开篇,重点是更好的理解C++相对于其他编程语言的一个特性,之后会持续更新,本次专栏计划是掌握C...

    一个热爱学习的深度渣渣5022022-03-10
  • C/C++C/C++ QT实现解析JSON文件的示例代码

    C/C++ QT实现解析JSON文件的示例代码

    JSON是一种轻量级的数据交换格式,它是基于ECMAScript的一个子集,使用完全独立于编程语言的文本格式来存储和表示数据。这篇文章主要介绍了QT实现解析JSO...

    LyShark8882022-08-13