将void指针强制转换为char *以进行指针运算

时间:2012-06-19 07:57:33

标签: c

在这段视频中,取自斯坦福大学的CS107讲座,教授似乎表示,对一个char *施放一个void *会在算术方面做同样的事情,就像把它投射到一个无符号长的那样。

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

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

他说他们是“两个4字节的数字”

我理解将void *转换为char *,因为它假设算术是sizeof(char)= 1。 但我不知道如何通过将它转换为无符号长*来做同样的事情,因为算术将以4为单位。我缺少什么?

2 个答案:

答案 0 :(得分:2)

  

他说他们是“两个4字节的数字”

在某个特定平台上可能也是如此,但一般都不能保证这种情况。

  

但我不知道如何通过将它转换为无符号长*来做同样的事情,因为算术将以4为单位。我缺少什么?

他没有施放到unsigned long*,他正在施放到unsigned long

答案 1 :(得分: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在其表示中的任何位置都可能有填充位。