我错过了几个课程,并没有真正理解流动的演讲幻灯片关于void指针的例子.
在"no,no,no"这一行中,为什么我们不能因为P被分配了一个真正的指针类型q而不需要P?
在"??"行中,将指针强制转换为整数是否合法?(我认为它可以编译,因为C不会检查强制转换,但不知道它将获得什么样的结果
在这个例子中
,整数指针转换为
他铸造的整数*p = 10; a =(int)p; 并且有人回答说a将是一个非常大的价值.但在我的情况下,是(int)*p ...是否与我上面给出的例子相同?
在最后一行,我对表达式感到困惑.*((int*)p)实际上是= p吗?谢谢!
"void*"的意思是"这个值是指向某个东西的指针,但我并没有告诉你它指向的是什么".从这个陈述开始,一切都有意义.
所以应该清楚的是,你不能取消引用空白*,因为没有人告诉你它指向的是什么!如果你不知道它是指向int,char还是某个struct,你认为如果你取消引用它会怎么样?
在C中,您可以为任何指针指定void*,例如指定给int*.编译器不知道 void*指向的是什么,但是当你写r = p时; 编译器说"我希望你知道你在做什么,我相信你."(同样情况下的C++编译器不信任你).如果void*p确实指向了int,那么一切都很好.否则,事情或多或少都会变坏.
?? ?? 一个是错的.你不能解除引用*p.不管你事后做什么,*p是不允许的.并且没有指针被转换为整数.尝试取消引用指针,这是不允许的.取消引用的结果可能没有任何用处,因为你不知道p指向什么,所以你没有什么用于强制转换为int.
现在在*(int*)中发生的事情p:p是一个void* - 指向某个东西的指针,但你不知道它指向的是什么.(int*)p是强制转换:p转换为int*.这意味着编译器会相信(int*)p指向一个int - 可能是也可能不是.*(int*)p取消引用int*:总的来说,你说服编译器p指向一个int,并读取p希望指向的int.如果p确实指向了int,那很好.如果p没有指向int,那你就麻烦了.