void*指针与自定义类型指针之间转换的使用技巧

前言
最近项目里遇到一个问题:给外部封装SDK时,最外层.h头文件里(就叫A.h吧),需要声明很多自定义类型的指针,而想要声明这些指针,最简单的方法就是在最外层.h头文件里,include定义了这些自定义类型的头文件(就叫B.h吧);但是这样做有个很大的问题,就是B.h很可能又依赖C.h、D.h…,导致给外部封的SDK里需要有一大堆的头文件。
针对这个问题,可以用下面方法解决:在最外层.h头文件A.h里,将自定义类型的指针变量,先声明成void类型的指针; 然后在.c/.cpp源文件里inlucde 文件B.h,并且在源文件里把void类型的指针强制转换成想要的类型指针进行使用。
举例:
A.h

void* p_fastreid=nullptr;
void* face_runtime = nullptr;

A.cpp

p_fastreid=new fastreid_libtorch(fastreid_config, device_type);  //正常是yourType 指针名=new yourType,但是这里直接让new出来的指针等于void*的指针,是因为不管new出来的是什么指针类型,void*类型指针都可以被其他任何类型指针直接赋值
auto ffs = ((fastreid_libtorch*)p_fastreid)->InferenceImages(src_img, tlwh_result);  //使用时需要特别注意,需要先通过(fastreid_libtorch*)这种形式,将void*指针类型,强制转换成对应指针类型(因为使用指针时,需要根据指针指向的不同类型,去内存找不同空间大小的数据)
delete p_fastreid; //使用完释放

B.h

class fastreid_libtorch {  //自定义类型的声明
public:
    explicit fastreid_libtorch(const YAML::Node &yolov5_config, const torch::DeviceType& device_type);
...
}

下面是转载的一篇博客,可以再学习下void*的使用,传送链接
一:void *是什么?
C语言中,*类型就是指针类型。比如 int *p,double q,虽然是不一样的指针,但是大小却一样sizeof§ == sizeof(q),其实很容易理解,因为他们都是同一种类型类型的。
C语言是强类型的语言。对类型的区分十分严格。那这两个有什么不同点吗?有,+1就不同了,看下面的图:
在这里插入图片描述

也就是对于一个指针而言,如果我们在前面规定了它的类型。那就相当于决定了它的“跳跃力”。“跳跃力”就比如说上面图中int跳了4个字节,但是double跳了8个字节。基于这样的理解,对void *下定义:
void * 是一个跳跃力未定的指针

二:void *的使用
1、关于赋值
1)void *可以接受任何类型的赋值:
    任何类型的指针都可以直接赋值给void *型指针,无需进行强制类型转换,相当于void *包含了其他类型的指针。

2)void *可以赋值给任何类型的变量
但是需要进行强制转换,应为void *的范围较大,所以强制转换,使其进行范围缩小。

void *主要使用在函数里,可以接受其他类型的指针,让函数使用起来更加便捷。
2、其他
void * 不能解引用 ;
void * 不能+ - 运算
三:总结
void *是一种指针类型,常用在函数参数、函数返回值中需要兼容不同指针类型的地方。我们可以将别的类型的指针无需强制类型转换的赋值给void *类型。也可以将void *强制类型转换成任何别的指针类型,至于强转的类型是否合理,就需要我们程序员自己控制了。

#include<stdio.h>
 
int main(int argc,char *argv[])
{
    int a = 2;
    double b = 2.0;
    void *c;                   //定义void *
    int *p = &a;              
    c = p;                    //将int * 转成void *,
    double *q = (double *)c;  //将void *转成double 
    printf("%.f\n",*q);
 
    return 0;
}
  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值