哈哈去找那个谁要!
他到处给的
没想还有要铜版的!
----------------解决方案--------------------------------------------------------
就不给我。。。
----------------解决方案--------------------------------------------------------
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]]
----------------解决方案--------------------------------------------------------
总是很佩服翅膀的钻研精神,把每个知识点钻研的很透彻。
上面两楼的回复,受益良多。
不过对于我引用的那个帖子,你的回答属于帖子之外的讨论了
没错,那个题目正好就是数组名退化为指针的情形,所以说它是char *是没有问题的,仅此而已。
这个问题的讨论就结束吧,至于你上面的东东,我还得消化消化,学习了。
----------------解决方案--------------------------------------------------------
好吧~~~最后说一点:
我的争辩,是针对你“a.name是char *”这句话的。如果a.name是char*,岂不是可以任意赋值了吗?呵呵~~~
----------------解决方案--------------------------------------------------------
他到处给的
没想还有要铜版的!
----------------解决方案--------------------------------------------------------
就不给我。。。
----------------解决方案--------------------------------------------------------
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[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 *
还真是绕口
"famin"这个东西是const char*
a.name是char *
可以把const char 或char型数据的地址赋给const char *
但是不能把const char型数据的地址赋给char *
还真是绕口
我的争辩,是针对你“a.name是char *”这句话的。如果a.name是char*,岂不是可以任意赋值了吗?呵呵~~~
----------------解决方案--------------------------------------------------------