📜  为什么数组索引从零开始?

📅  最后修改于: 2021-05-25 22:17:24             🧑  作者: Mango

先决条件:C / C++中的指针

可能有很多原因,但有两种原因:

原因1:
考虑int arr [100]。答案在于以下事实:编译器如何解释arr [i](0 <= i <100)。
arr [i]被解释为*(arr + i)。现在,arr是数组的地址或数组的第0个索引元素的地址。因此,数组中下一个元素的地址为arr + 1(因为数组中的元素存储在连续的内存位置中),下一位置的另一个地址为arr + 2,依此类推。加上以上参数,arr + i表示距数组起始元素i处的地址。因此,按照这个定义,对于数组的起始元素,i将为零,因为起始元素与数组的起始元素相距0距离。为了符合arr [i]的定义,数组的索引从0开始。

CPP
#include
using namespace std;
 
int main()
{
    int arr[] = {1, 2, 3, 4};
 
    // Below two statements mean same thing
    cout << *(arr + 1) << " ";
    cout << arr[1] << " ";
 
    return 0;
}


输出:
2 2



结论是,我们需要对数组进行随机访问。为了提供随机访问,编译器使用指针算法来达到第i个元素。

原因2:

现代语言(尤其是C++)使用行优先 存储二维数组的顺序。

让我们假设一个2D数组,并用两种不同的方法编写一个主要行公式:

  1. 数组索引从1开始
  2. 数组索引从0开始

令2D数组为int类型的arr [m] [n]

让&arr为“地址”

因此,我们在这里看到,当我们存储2D数组并获得元素的地址时,我们执行的操作减少了2次。看起来似乎没有任何意义,但确实有道理!在处理海量数据时,这可能会提高性能和速度。情况1看起来对用户友好,但是情况2效率更高。这就是为什么大多数语言(例如C++,PYTHON, Java)使用以索引0开头的数组,而很少使用以索引1开头的Lua数组之类的语言的原因。

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”