Code Bye

《C和指针》中关于指针与下标的问题

问题位于 8.13 指针与下标 小节中
原文:
假定这两种方法都是正确的,下标绝不会比指针更有效率,但指针有时会比下标更有效率。
为了理解这个效率问题,让我们来研究两个循环,它们用于执行相同的任务。首先,我们使用下标方案将数组中的全部元素都设置为0。
int array[10], a;
for( a = 0; a < 10; a += 1 )
array[a] = 0;
为了对下标表达式求值,编译器在程序中插入指令,取得a的值,并把它与整型的长度(也就是4)相乘。这个乘法需要花费一定的时间和空间。
问题:
红字部分就是本人的疑问,为什么要用a的值和整型的长度相乘,乘出来的又是什么,有些没看懂,感谢各路高手帮忙解答
解决方案

5

请忽略以上的叙述。(可以忽略以上有关效率的全部文字)
随着 CPU 、体系结构 与 编译器的发展,以上说法的正确性在随时发生着变化。

30

int array[10],  说明数组元素为整形。
取得a的值,并把它与整形的长度(也就是4)相乘,就是根据下标a,乘以4(整形量所占内存的字节数),所得结果就是下标变量相对数组起始位置的偏移,也就是array[a]所对应的“变量地址”(当然要加上数组基址)
int array[10], a;
for(a = 0; a < 10; a += 1)
     array[a] = 0;

为了对下标表达式求值,编译器在程序中插入指令,取得a的值,并把它与整形的长度(也就是4)相乘。这个乘法需要花费一定的时间和空间。

int array[10], *ap;
for(ap = array; ap < array + 10; ap++)
     *ap = 0;

ap++中,++其实就是在ap当前指针所指的位置处,加上一个ap所指元素的类型的长度,这里就是int,即4。也就是1必须与整形的长度(也就是4)相乘,然后再与指针相加。
从这里,貌似两个循环都进行了乘法,好像没有什么差异。可是,你注意到没有2个循环其实是有很大的不同的。不同在哪里呢?
仔细看,会发现数组下标中的a每次的值是不同的,每次a都会与长度4进行相乘,即进行了10次乘法。
再看看指针,你会发现ap++时,是1与长度4进行相乘,再与指针相加。每次执行乘法时,其实就是1*4。这个乘法只在编译时进行了一次运算。程序执行的时候,就没有进行乘法运算,只是简单的将4与指针相加而已。

指针比下标更有效率的一个典型。你会发现在这个场合中 — 当你在数组中1次1步(或某个固定的数字)地移动时,与固定数字相乘的运算在编译时完成,所以运行时所需的指令就少一些。在绝大多数机器上,程序竟会更小一些、更快一些。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明《C和指针》中关于指针与下标的问题