Q: 6.3 那么C语言的“指针和数组等价”是什么意思?


A: 在C语言中,围绕数组和指针的许多混淆,可以追溯到对这句话的误解。说数组和指针“等价”,不是说它们是一样的,甚至也不是它们可互换。它的意思是,数组和指针算术被定义成可以方便地用于访问或模拟一个数组。(换句话说,像Wayne Throop说的,它的“指针算术和数组索引在C语言里等价,指针和数组是不同的。”)

确切地说,等价的基础是这个关键定义:

到一个 T 类型数组的引用,出现在一个表达式中时,会蜕变(有三种例外)为一个到它的第一个元素的指针;产生的指针的类型是指向 T 类型的指针。

即是不论何时,当一个数组出现在一个表达式中,编译器隐含地生成,一个到数组的第一个元素的指针,就好像程序员这样写&a[0]。(例外是当数组是sizeof或&的运算对象,或者一个初始化字符数组的串常量。分别参见问答6.23、6.12、1.32。)

作为这个定义的的结果,不管底层数组和指针完全不同的事实,毕竟,编译器不会在数组和指针上,应用下标运算符[]有所不同。假设一个数组a和一个指针p,一个a[i]形式的表达式,遵从上面的规则,导致数组蜕变为指针,之后去下标就像指针变量在p[i]这个表达式中(尽管最终的内存访问可能不同,像问答6.2中的解释)。如果你将要把数组的地址赋给指针:

  p = a;

那么p[3]和a[3]访问同一个元素。

这种一致的访问解释了指针如何能访问数组,满足于它们作为函数参数(参见问答6.4),和模拟动态数组的用途(参见问答6.14)。

同时参见问答6.8、6.10、6.14。

参考:K&R1 Sec. 5.3 pp. 93-6
K&R2 Sec. 5.3 p. 99
ISO Sec. 6.2.2.1, Sec. 6.3.2.1, Sec. 6.3.6
H&S Sec. 5.4.1 p. 124


(This Chinese translation isn't confirmed by the author, and it isn't for profits.)

Translator : jhlicc@gmai1.c0m
Origin : http://www.c-faq.com/aryptr/aryptrequiv.html