void*指针与自定义类型指针之间转换的使用技巧 您所在的位置:网站首页 C里面void里可以再定义void void*指针与自定义类型指针之间转换的使用技巧

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

2024-06-12 12:23| 来源: 网络整理| 查看: 265

前言 最近项目里遇到一个问题:给外部封装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 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; }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有