moonwalker。一个最简单的道理。int a=10;char b=10;现在判断if(a==b)成立。你说a和b等不等价?
a和b是等价的。我们说如果一个关系满足自反性,对称性,传递性。那么这个关系就被叫做等价关系。这里a和b相对于==的确是等价的。但这不代表a和b相等,也不代表a和b的类型相同。
注意三个称呼:等价,相等,类型相同。为什么a和b不相等呢?因为a占用4个字节的内存。而b占用一个字节。它们在物理值上肯定不相同。为什么说a和b类型不同呢,这个似乎不需要解释了吧?
回到原题。
我们说,char[10]类型和char*类型在使用上是等价的,除了三种情况。这个结论的得来是因为数组的一个重要性质:数组名会自发地退化为其所包含元素类型的常指针。而索引运算符这个二目操作符对其操作数的要求是一边为指针,另一边为数字。仅此而已。所以在使用索引操作符时,数组和指针等价。
注意:1 C本质上是弱类型语言。任何内部类型都能自发地转换。当然也包括指针,所以指针之间相互的隐式转换不能作为相等的证明,而C++也不反对指针之间的转换。最简单的,对于上面的类型,我们可以写b=a,但是这并不代表char就是int。
2 。例外的三种情况为, 数组为sizeof 或&操作符的操作数, 或者为字符数组的字符串初始值。