prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 6.3

Q在 C 语言中,“指针与数组的等价性”是什么意思?


A在 C 语言中,围绕数组和指针的许多困惑都源于对这一说法的误解。说数组和指针是“等价的”,既不是说它们完全相同,也不是说它们可以互换。它的意思是,数组和指针的算术运算被定义为,指针可以方便地用于访问数组或模拟数组。换句话说,正如 Wayne Throop 所说,“在 C 语言中,是指“指针算术和数组索引是等价的,指针和数组是不同的。””

具体来说,等价性的基石是这个关键定义:

对类型为 T 的数组对象的引用,在表达式中(除三种情况外)会“退化”为其第一个元素的指针;所得指针的类型是指向 T 的指针。

也就是说,每当数组出现在表达式中时,编译器都会隐式生成指向数组第一个元素的指针,就好像程序员写了&a[0]一样。(例外情况是,当数组是sizeof&运算符的操作数,或者是一个字符数组的字符串字面量初始值。 [脚注] 分别参见问题 6.236.121.32。)

因此,尽管底层数组和指针差异很大,编译器对数组和指针应用的数组下标运算符[]在本质上没有太大区别。 [脚注] 给定一个数组a和一个指针p,表达式形式a[i]会按照上述规则使数组退化为指针,然后就像在表达式p[i]中对指针变量进行下标操作一样对其进行下标操作(尽管最终的内存访问会不同,如问题 6.2 所解释)。如果即将数组的地址赋给指针

	p = a;
然后p[3]a[3]将访问同一个元素。

这种访问的一致性解释了指针如何访问数组、如何作为函数参数代替数组(参见问题 6.4),以及如何模拟动态数组(参见问题 6.14)。

另请参见问题 6.86.106.14

参考文献:K&R1 第 5.3 节,第 93-6 页
K&R2 第 5.3 节,第 99 页
ISO 第 6.2.2.1 节、第 6.3.2.1 节、第 6.3.6 节
H&S 第 5.4.1 节,第 124 页


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管