什么时候需要显式指针类型转换?

时间:2013-06-12 12:17:09

标签: c++ c pointers casting

在C中,如果我有两种类型的指针:

typeB *q;
typeA *p; 

在下面,是否有必要进行显式转换(typeA *)

1    p= q       is fine, no need to use p = (typeA  *)q;

2    define: void func(typeA *p){}

     call:  func(q);  is fine, no need to use func((typeA  *)q)

3    p=malloc(sizeof(typeA));   is fine, no need to use p=(typeA  *)malloc(sizeof(typeA))

此外,C ++是否相同?

谢谢!

3 个答案:

答案 0 :(得分:5)

我会假设它们是不相关的类型。如果它们都是同一类型的别名,则指向一个的指针可以隐式转换为指向另一个的指针。

  1. 没有;在两种语言中,您需要使用强制转换来在不相关的指针类型之间进行转换在C ++中,如果typeAtypeB的基类,则可以。

  2. 与第一个完全相同 - 两者都试图从typeA*初始化typeB*

  3. C中很好; void*可以隐式转换为任何对象指针类型。在C ++中不允许这种转换;但是你通常不应该使用malloc

答案 1 :(得分:4)

如果您使用期望TypeB *的{​​{1}},那么您始终需要演员。在C中,有两个例外:如果另一种类型是数据指针类型,则从和TypeA *的转换是隐式的(不需要强制转换)。仅在POSIX下,void *也与函数指针类型隐式兼容。

但是,在C ++中,只有转换为 void *是隐式的,因此分配void * 仍然需要转换。

另一个区别是,在C ++中,如果T *p = <expression of type void *>;TypeA是类(或结构)类型,TypeB继承自TypeB,那么从{{1}转换} TypeA(“向下转换”)再次隐含(不需要强制转换)。当然,这不会倒退(“向上转发”)。

总而言之,您不会转换TypeB *的返回值,因为:

    在C中
  • 不是必需的;

  • 在C ++中它是必需的,但在C ++中你还是不使用TypeA *

答案 2 :(得分:0)

对于前两种情况,你需要进行类型转换(在c和c ++中)因为它们不是void类型所以需要显式地转换它们。

对于第三种情况,malloc返回void指针,它将根据cast进行更改。因此不需要在此处进行显式类型转换(在c中)。