14.2 数组退化为指针
处于效率和方便性的考虑,而且也许是因为历史性的偶然,C和C++(www.cppentry.com)中的数组与指针之间的差别模糊不清。指针对应于一个存储位置,其中保存的值指向可寻址内存空间中的某处。数组则是某个特定类型的一个或多个实例连续存放的内存块。跟数组元素具有同样类型的指针可以被设置为指向数组中的任何一个元素,并且,对该指针解引用(dereferencing)所得到的值与对数组进行对应的下标索引所得到的值是一样的(事实上,指针与数组之间的相互转换自由灵活得有点过头了,以至于会为我们带来另一个问题。详见14.6节)。因此:
- int ar[5];
- int *p = ar;
ar是一个int数组,拥有5个元素,p是一个指向int的指针。由于数组可以被转换为指针(C++(www.cppentry.com)-98: 4.2),所以将ar赋给p是完全合法的,但是该赋值语句实际上的含义却是:p指向ar的第一个元素,或者p保存的是ar的第一个元素的地址:- int *q = &ar[0];
- assert(p == q);
将下标索引操作符运用到p身上同样是合法的,而且也相当常见,因此下面的两行代码语义上完全等同:
- int v1 = ar[3];
- int v2 = p[3];
- assert(v1 == v2);