数组元素的访问方式有下标引用和间接访问两种.
除了优先级之外, 下标引用和间接访问完全相同. arrayname[subscript] = *(arrayname + (subscript))
例如:
int arrayname[10];
int *arrayptr = arrayname + 2;
arrayptr = arrayname+2 = &arrayname[2]
*arrayptr = arrayname[2] = *(arrayname+2)
arrayptr[0] = *(arrayptr+(0)) = arrayname[2] = *(arrayname+2)
arrayptr+6 = arrayname+8 = &arrayname[8]
*arrayptr+6 = *(arrayname+8)+6 = arrayname[2]+6
*(arrayptr+6) = *(arrayname+8) = arrayname[8]
arrayptr[6] = *(arrayptr+(6)) = *(arrayname+8) = arrayname[8]
arrayptr[-1] = *(arrayptr+(-1)) = *(arrayname+1) = arrayname[1]
2[arrayname] = *(2+(arrayname)) = *(arrayname+2) = arrayname[2]
如果可以互换的使用下标引用和间接(指针)引用, 那么应该选择哪一个呢?
通常考虑以下方面:
1. 下标访问更容易理解, 可读性更高.
2. 下标引用不会比指针引用更有效率, 但是有时指针会比下标更有效率.
考虑下面的循环:
// 使用下标
int arrayname[10], index;
for(index = 0; index < 10; index++)
arrayname[index]= 0;
在每次循环中, 程序获取index的值并于 sizeof(int) 相乘(因为数组指针的移动的间隔是sizeof(int)个内存单元). 这个乘法需要花费一定的时间和空间.
// 使用指针
int arrayname[10], *arrayptr;
for(arrayptr = arrayname; arrayptr < arrayname + 10; arrayptr++)
*arrayptr = 0;
上述代码中仍然存在乘法运算, 即 arrayptr++ 中, 1 * sizeof(int) 后与arrayptr相加. 但是注意到每次乘法都是 1 * sizeof(int) 所以编译器在编译时执行一次乘法后程序运行时就不再需要执行乘法, 程序中包含了数组指针与 1 * sizeof(int) 结果相加的指令.