需要显式指针类型强制转换时

when explicit pointer type cast is needed?

本文关键字:转换 类型 指针      更新时间:2023-10-16

在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++是不是一样的?

谢谢!

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

  1. 没有;在这两种语言中,都需要使用强制类型转换在不相关的指针类型之间进行转换。在c++中,如果typeAtypeB的基类,则没有问题。

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

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

如果您在TypeA *应该使用的地方使用TypeB *,那么您总是需要强制转换。在C语言中,有两个例外:如果另一个类型是数据指针类型,则从和到void *的转换是隐式的(不需要强制类型转换)。只有在POSIX下,void *才隐式兼容函数指针类型。

然而,在c++中,只有将转换为 void *是隐式的,因此将T *p = <expression of type void *>;赋值为仍然需要强制类型转换。

另一个区别是,在c++中,如果TypeATypeB是类(或结构)类型,而TypeB继承自TypeA,那么从TypeB *TypeA *的转换("向下转换")也是隐式的(不需要强制转换)。当然,这不能反向工作("upcasting")。

总而言之,您不强制转换malloc()的返回值,因为:

    C中不需要
  • ;

  • 在c++中它是必需的,但是在c++中你不使用malloc()

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

对于第三种情况,malloc返回void指针,该指针将根据类型转换改变自身。所以这里不需要显式的类型转换(在c中)。