先决条件: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开始
- 数组索引从0开始
令2D数组为int类型的arr [m] [n]
让&arr为“地址”
case 1 ( array indices start from 1 ) :
&( arr[i][j] ) = address + [ ( i-1 )*n + ( j-1 ) ]*( sizeof(int) ) ] so here we are performing 6 operations
case 2 ( array indices start from 0 ) :
&( arr[i][j] ) = address + [ ( i )*n + ( j ) ]*( sizeof(int) ) ] and here we are performing only 4 operations
因此,我们在这里看到,当我们存储2D数组并获得元素的地址时,我们执行的操作减少了2次。看起来似乎没有任何意义,但确实有道理!在处理海量数据时,这可能会提高性能和速度。情况1看起来对用户友好,但是情况2效率更高。这就是为什么大多数语言(例如C++,PYTHON, Java)使用以索引0开头的数组,而很少使用以索引1开头的Lua数组之类的语言的原因。