| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2313 人关注过本帖
标题:关于数组类型的讨论
只看楼主 加入收藏
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
偶花了15分钟的实验,被你们搞得这么水。。

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-05-10 00:18
c_acceleration
Rank: 1
等 级:新手上路
帖 子:101
专家分:0
注 册:2008-4-28
收藏
得分:0 
[bo]以下是引用 [un]moonwalker[/un] 在 2008-5-10 00:18 的发言:[/bo]

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


看看我说的,真诚啊,给铜板,多点

天道酬勤
2008-05-10 00:19
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
[bo]以下是引用 [un]c_acceleration[/un] 在 2008-5-9 23:22 的发言:[/bo]

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

说等价的确有些过了,
主要是想说数据类型相同

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-05-10 00:26
c_acceleration
Rank: 1
等 级:新手上路
帖 子:101
专家分:0
注 册:2008-4-28
收藏
得分:0 
给铜板。。。。。。。。。。。。。。。。。。。。。。。。。。
收到的鲜花
  • moonwalker2008-05-10 22:34 送鲜花  1朵   附言:我就喜欢一个一个给,急死你
  • moonwalker2008-05-10 22:35 送鲜花  1朵  
  • moonwalker2008-05-10 22:35 送鲜花  1朵  

天道酬勤
2008-05-10 00:29
qinxinhai
Rank: 1
来 自:湖南长沙
等 级:新手上路
帖 子:237
专家分:0
注 册:2008-4-27
收藏
得分:0 
哈哈去找那个谁要!
他到处给的
没想还有要铜版的!

我秀我自己
2008-05-10 00:32
c_acceleration
Rank: 1
等 级:新手上路
帖 子:101
专家分:0
注 册:2008-4-28
收藏
得分:0 
就不给我。。。

天道酬勤
2008-05-10 00:35
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分: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 或&操作符的操作数, 或者为字符数组的字符串初始值。

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-10 04:46
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
对上面发言的几点说明:
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]]

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-10 05:01
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
总是很佩服翅膀的钻研精神,把每个知识点钻研的很透彻。
上面两楼的回复,受益良多。
不过对于我引用的那个帖子,你的回答属于帖子之外的讨论了
[bo]以下是引用 [un]StarWing83[/un] 在 2008-5-10 04:46 的发言:[/bo]
我们说,char[10]类型和char*类型在使用上是等价的,除了三种情况。这个结论的得来是因为数组的一个重要性质:数组名会自发地退化为其所包含元素类型的常指针。 ...

没错,那个题目正好就是数组名退化为指针的情形,所以说它是char *是没有问题的,仅此而已。
这个问题的讨论就结束吧,至于你上面的东东,我还得消化消化,学习了。

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-05-10 22:42
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
好吧~~~最后说一点:
[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*,岂不是可以任意赋值了吗?呵呵~~~

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-05-10 22:52
快速回复:关于数组类型的讨论
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018081 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved