在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 ++是否相同?
谢谢!
答案 0 :(得分:5)
我会假设它们是不相关的类型。如果它们都是同一类型的别名,则指向一个的指针可以隐式转换为指向另一个的指针。
没有;在两种语言中,您需要使用强制转换来在不相关的指针类型之间进行转换在C ++中,如果typeA
是typeB
的基类,则可以。
与第一个完全相同 - 两者都试图从typeA*
初始化typeB*
。
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 ++中你还是不使用TypeA *
。
答案 2 :(得分:0)
对于前两种情况,你需要进行类型转换(在c和c ++中)因为它们不是void类型所以需要显式地转换它们。
对于第三种情况,malloc返回void指针,它将根据cast进行更改。因此不需要在此处进行显式类型转换(在c中)。