1

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

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++ 是否相同?

谢谢!

4

3 回答 3

5

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

  1. 不; 在这两种语言中,您都需要强制转换来在不相关的指针类型之间进行转换。在 C++ 中,如果typeAtypeB.

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

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

于 2013-06-12T12:23:18.737 回答
4

如果你使用TypeB *where TypeA *is expected,那么你总是需要演员表。在 C 中,有两个例外:void *如果另一个类型是数据指针类型,则 from 和 to 的转换是隐式的(不需要强制转换)。只有在 POSIX 下,void *它也隐式兼容函数指针类型。

然而,在 C++ 中,只有转换 void *是隐式的,所以赋值T *p = <expression of type void *>; 仍然需要强制转换。

另一个区别是,在 C++ 中,如果TypeATypeB是类(或结构)类型,并且从该类型TypeB继承,TypeATypeB *到的转换TypeA *(“向下转换”)再次是隐式的(不需要强制转换)。当然,这不能向后工作(“向上转换”)。

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

  • 不需要在 C 中;

  • 在 C++ 中它是必需的,但在 C++ 中你无论如何都不使用malloc()

于 2013-06-12T12:26:27.253 回答
0

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

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

于 2013-06-12T12:24:05.663 回答