array[subscript] *(array+(subscript))
2. 2[array]表达式是合法的 表示的意思与*(2+array),也就是*(array+2)是完全一样的。但是绝对不应该这么写,影响程序的可读性。
![C语言--下标引用 c语言下标运算符](http://img.413yy.cn/images/31101031/31052842t016aa278b9281a5452.jpg)
3.在可读性方面,下标有一定的优势。但在另一方面,这个选择可能会影响运行时效率。假定这两种方法都是正确的,下标绝不会比指针更有效率,但指针有时会比下标更有效率。
以下面两个循环来进行研究,它们用于执行相同的任务,将数组的所有元素都置为0。首先,使用下标方案: int array[10],a; for( a = 0; a <10; a+=1) array[a] =0; 为了对下标表达式求值,编译器在程序中插入指令,取得a的值,并把它与整型的长度(也就是4)相乘。这个乘法需要花费一定的时间和空间。 下面使用另一种方案: int array[10],*ap; for( ap= 0; ap<10; ap++) *ap = 0; 这个乘法运算出现在for语句的调整部分。1这个值必须与整型的长度相乘,然后再于指针相加。但这里存在一个重大区别:循环每次执行时,执行乘法运算的都是两个相同的数(1和4)。结果,这个乘法只在编译时执行一次——程序现在包含了一条指令,把4与指针相加。程序在运行时并不执行乘法运算。 这个例子说明了指针比下标更有效率的场合——当你在数组中1次1步(或某个固定的数组)地移动时,与固定数组相乘的运算在编译时完成,所以在运行时所需的指令就少一些。 现在考虑下面两个代码段: a = get_value(); a = get_value(); array[a] = 0; *(array +a) = 0; 两边的语句所产生的代码并无区别。a可能是任何值,在运行时方知。所以两种方案都需要你乘法指令,用于对a的值进行调整。这个例子说明了指针和下标效率完全相同的场合。