当前位置: 代码迷 >> C语言 >> 关于数组类型的讨论
  详细解决方案

关于数组类型的讨论

热度:123   发布时间:2008-05-10 00:18:51.0
偶花了15分钟的实验,被你们搞得这么水。。
----------------解决方案--------------------------------------------------------
[bo]以下是引用 [un]moonwalker[/un] 在 2008-5-10 00:18 的发言:[/bo]

偶花了15分钟的实验,被你们搞得这么水。。


看看我说的,真诚啊,给铜板,多点
----------------解决方案--------------------------------------------------------
[bo]以下是引用 [un]c_acceleration[/un] 在 2008-5-9 23:22 的发言:[/bo]

实验结论:运算符[]和指针*等价
怎么能说等价,优先级就不同。。。

说等价的确有些过了,
主要是想说数据类型相同
----------------解决方案--------------------------------------------------------
给铜板。。。。。。。。。。。。。。。。。。。。。。。。。。
本帖最近评分记录

天道酬勤
2008-05-09 16:29:07
qinxinhai

来 自:湖南长沙
等 级:新手上路
帖 子:237
专家分:0
注 册:2008-4-27
  得分:0 
哈哈去找那个谁要!
他到处给的
没想还有要铜版的!
----------------解决方案--------------------------------------------------------
就不给我。。。
----------------解决方案--------------------------------------------------------
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 或&操作符的操作数, 或者为字符数组的字符串初始值。
----------------解决方案--------------------------------------------------------
对上面发言的几点说明:
1 有人可能会说,a==b了啊,为什么说a和b不相等呢?因为a和b的类型不同。两者不能直接比较。所以在比较的时候,b自动进化为int,然后==两边有了相同类型,才会进行比较。这一点和数组名自动退化为指针很相似,可以用来做类比。

2 上面的等价关系说得很复杂。其实在上面,等价关系就是“其值相等”。我们说a和b虽然不相等,但是a和b其值相等。同样的。我们说数组和指针不相等。但是我们说数组名和指针其值相等。注意两者的区别。

3 我在LZ引用的帖子中已经给出了一种证明指针和数组不相等的方法。现在给出另一种方法。假设有个函数为void func(int (&a)[10);你如果传指针过去,会报错。如果有个函数为void func(int* &a);你如果传数组名过去,也会报错。这里使用了引用,因为引用要求双方相等(而不是等价),所以上面两个行为会被制止。这也证明了指针和数组并不相等。这里使用引用是为了避免上面所说的数组名自动退化为指针的行为。因为非常引用是无法绑定临时变量的,也就避免了隐式的退化。

[[it] 本帖最后由 StarWing83 于 2008-5-10 05:03 编辑 [/it]]
----------------解决方案--------------------------------------------------------
总是很佩服翅膀的钻研精神,把每个知识点钻研的很透彻。
上面两楼的回复,受益良多。
不过对于我引用的那个帖子,你的回答属于帖子之外的讨论了
[bo]以下是引用 [un]StarWing83[/un] 在 2008-5-10 04:46 的发言:[/bo]
我们说,char[10]类型和char*类型在使用上是等价的,除了三种情况。这个结论的得来是因为数组的一个重要性质:数组名会自发地退化为其所包含元素类型的常指针。 ...

没错,那个题目正好就是数组名退化为指针的情形,所以说它是char *是没有问题的,仅此而已。
这个问题的讨论就结束吧,至于你上面的东东,我还得消化消化,学习了。
----------------解决方案--------------------------------------------------------
好吧~~~最后说一点:
[bo]以下是引用 [un]moonwalker[/un] 在 2008-5-8 23:43 的发言:[/bo]

"famin"这个东西是const char*
a.name是char *
可以把const char 或char型数据的地址赋给const char *
但是不能把const char型数据的地址赋给char *
还真是绕口


我的争辩,是针对你“a.name是char *”这句话的。如果a.name是char*,岂不是可以任意赋值了吗?呵呵~~~
----------------解决方案--------------------------------------------------------
  相关解决方案