需要显式指针类型强制转换时
when explicit pointer type cast is needed?
在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++是不是一样的?
谢谢!
我假设它们是不相关的类型。如果它们都是同一类型的别名,则指向其中一个类型的指针可以隐式转换为指向另一个类型的指针。
-
没有;在这两种语言中,都需要使用强制类型转换在不相关的指针类型之间进行转换。在c++中,如果
typeA
是typeB
的基类,则没有问题。 -
与第一个完全相同-两者都试图从
typeB*
初始化typeA*
。 -
Fine in C;
void*
可以隐式转换为任何对象指针类型。c++中不允许这种转换;但是你通常不应该使用malloc
如果您在TypeA *
应该使用的地方使用TypeB *
,那么您总是需要强制转换。在C语言中,有两个例外:如果另一个类型是数据指针类型,则从和到void *
的转换是隐式的(不需要强制类型转换)。只有在POSIX下,void *
才隐式兼容函数指针类型。
void *
是隐式的,因此将T *p = <expression of type void *>;
赋值为仍然需要强制类型转换。另一个区别是,在c++中,如果TypeA
和TypeB
是类(或结构)类型,而TypeB
继承自TypeA
,那么从TypeB *
到TypeA *
的转换("向下转换")也是隐式的(不需要强制转换)。当然,这不能反向工作("upcasting")。
总而言之,您不强制转换malloc()
的返回值,因为:
- C中不需要
;
在c++中它是必需的,但是在c++中你不使用
malloc()
对于前两种情况,您需要进行类型转换(在c和c++中都是),因为它们不是void类型,因此需要显式地进行类型转换。
对于第三种情况,malloc返回void指针,该指针将根据类型转换改变自身。所以这里不需要显式的类型转换(在c中)。
- 无法转换类型 C++
- 包含可变参数包的第一个可转换类型的别名的结构
- 将 std::conditional 与不可转换类型(原始与指针)一起使用
- 链接方法时出现转换类型错误
- 如何避免隐式转换类型
- 在多重继承场景中动态强制转换类型
- 编译器不支持的转换类型
- 错误调用功能无法转换类型
- 我想看到一个在整个后缀表达式的上下文中查找转换类型 id 的示例
- 对于动态类型为强制转换类型的对象,dynamic_cast失败
- 无法在初始化中转换类型
- 如何让"auto"转换类型
- 如何通过强制转换类型指针将字符数组转换为uint16_t
- 如何从新运算符+(Template类)返回具有转换类型的对象
- 带有模板的基于枚举的工厂无法转换类型
- 使用SWIG类型映射通过字符串转换类型
- 对于可转换类型,设计比循环依赖项更好
- SWIG不能正确转换类型定义
- 将类型转换扩展到可转换类型的对/元组
- 想要将字符数组的部分转换/类型转换为值