如何可以互换地使用指针表达式与表达式,应该使用哪种更为合适?对于大多数而言下标更容易理解,尤其在多维数组中。所以在可读性方面,下标更有优势。而我本人的编程习惯也倾向于使用下标,而且还一直以为下标与指针表达式等价。直到看了《C与指针》才知道,其实这两者有效率上的区别。
假定两种方法都是正确的,下标绝对不会比指针更有效率,但指针有时会比下标更有效率
为了理解这个效率问题,让我们来研究两个循环,他们用于执行相同的任务。首先,我们使用下标方案将数组中的所有元素都设置为 0。
int array[10], a;
for (a = 0; a < 10; i++)
array[a] = 0;
为了对下标表达式求值,编译器在程序中插入指令,取得 a 的值,并把它与整数的长度(也就是 4)相乘。这个乘法需要花费一定的时间与空间。
现在再让我们看看下面这个循环,它所执行的任务和前面的循环完全一样。
int array[10], *ap;
for (ap = array; ap < array + 10; ap++)
*ap = 0;
尽管这里并不存在下标,但还是存在乘法运算。现在,这个乘法运算出现在 for 语句的调整部分。1 这个值必须与整数的长度想乘,然后再与指针相加。但这里存在一个重大的区别:这个乘法只在编译时执行一次——程序现在包含了一条指令,把 4 与指针相加。程序在运行时没有乘法的换算。
这个例子说明了指针比下标更有效率的场合,因为了乘法的换算。在绝大数机器上,程序就会更小、更快一些。