我正在阅读Kochan的书"C编程".在p.中的Pointer和Arrays部分中.264他说:
通常,索引数组的过程比访问指针内容的过程花费更多的时间来执行.实际上,这是使用指针访问数组元素的主要原因之一 - 生成的代码通常更有效.当然,如果对数组的访问通常不是顺序的,那么只要涉及这个问题,指针就什么都不做,因为表达式*(指针+ j)和表达式数组[j]的执行时间一样长.
有人可以解释什么比什么更快?具体来说,如果array [j]的速度=*(指针+ j)的速度那么索引数组的过程是什么,以及访问指针内容的过程是什么?此外,有关SO的问题和答案提到在编译期间将数组[j]转换为*(数组+ j),因此不应有任何区别.
总结:请给我一个Kochan所说的非常简单的例子.2个代码并指向更快的代码,不必解释为什么它是真的.
看看片段
int arr[5] = {0};
int *p = arr;
int c = 1;
Run Code Online (Sandbox Code Playgroud)
现在,看到循环1:
for(int i = 0; i < 5; i++)
arr[i] = c++ + 1;
Run Code Online (Sandbox Code Playgroud)
循环2:
for(int i = 0; i < 5; i++)
*p++ = c++ + 1;
Run Code Online (Sandbox Code Playgroud)
这两个循环之间的区别在于它们的主体.第一个循环包含arr[i] = c++ + 1.这相当于*(arr + i) = c++ + 1.它是什么意思*(arr + i)?
这意味着:
i i到基址. 而在第二个循环的身体*p++意味着:
p 1. 当然第二个会执行得更快.但是,现在有一天现代编译器足够智能来优化这些代码,并且很可能你会得到两个循环相同的结果.