2

在这段视频中,取自斯坦福大学的 CS107 讲座,教授似乎表示,将 void* 转换为 char* 在算术方面与将其转换为无符号长整数的效果相同。

http://www.youtube.com/watch?v=_eR4rxnM7Lc&t=44m30s

有问题的部分从 44:30 到 46:00 左右

他说它们“都是 4 字节的数字”

我理解将 void* 转换为 char*,因为它将假设算术是 sizeof(char) = 1。但我不明白如何通过将其转换为 unsigned long* 来做同样的事情,因为算术将是以 4 为单位。我错过了什么?

4

2 回答 2

2

他说它们“都是 4 字节的数字”

在特定平台上这很可能是正确的,但一般情况下都不能保证是这样。

但是我不明白如何通过将其转换为 unsigned long* 来做同样的事情,因为算术将以 4 为单位。我错过了什么?

他不是投向unsigned long*,他是投向unsigned long

于 2012-06-19T08:04:03.747 回答
0

在去年某个特定的星期二,在该教授的特定机器上,该陈述可能是正确的,但总的来说,它是错误的。如果char *unsigned long可以被同等对待,C 将不需要两种不同的类型。

教授可能想说的是以下规则:

对于任何指针类型的变量(除了void指针),以下成立:(p + 1 == (T*) (((char*)p) + sizeof(*p))其中T的类型是*p),即给指针加 1 会增加它所指向的类型的大小。

因为sizeof(char) == 1,x+1将具有相同的值,如果xchar *unsigned long,鉴于 ,sizeof(char *) == sizeof(unsigned long)除非“你知道你在做什么”,否则不要假设。

请注意,由于各种原因,实际表示可能会有所不同,最明显的是因为unsigned long可能在其表示中的任何地方都有填充位。

于 2012-06-19T08:14:18.157 回答