指针与下标


如何可以互换地使用指针表达式与表达式,应该使用哪种更为合适?对于大多数而言下标更容易理解,尤其在多维数组中。所以在可读性方面,下标更有优势。而我本人的编程习惯也倾向于使用下标,而且还一直以为下标与指针表达式等价。直到看了《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 与指针相加。程序在运行时没有乘法的换算。

这个例子说明了指针比下标更有效率的场合,因为了乘法的换算。在绝大数机器上,程序就会更小、更快一些。


文章作者: Caffreyfans
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Caffreyfans !
 上一篇
如何将变量中的值以二进制形式打印出来 如何将变量中的值以二进制形式打印出来
如何将变量中的值以二进制形式打印出来先看源码: #include <stdio.h> #include <string.h> const char *uint64_to_binary(int n) { sta
2020-12-20
下一篇 
译:UEFI 启动真正做了什么 译:UEFI 启动真正做了什么
该文译自 Adam Willianson 的 “UEFI boot:how does that actually work, then?” 又是 AdamW 文章时间了!如果你是想找简短而生动的文章,请到别处。 Kamil Paral 友好
2020-09-04
  目录