void*指针的使用和问题说明

今天在移植和优化算法程序时遇到一个问题,这个问题可能老手工程师会经常见,我却在这里犯迷糊了,

话不多说先上代码看看问题是啥

	
        typedef void *GDALDatasetH;

        GDALDatasetH baseImgDS = GDALOpenShared(baseImgPath,GA_ReadOnly);
	GDALDatasetH regImgDS = GDALOpenShared(regImgPath, GA_ReadOnly);

	GDALDatasetH *baseds = baseImgDS;
	GDALDatasetH *regds = regImgDS;

先来说明一下typedef void *GDALDatasetH;的问题,

这个的含义其实是说明用GDALDatasetH来代表void*,

也可以理解为GDALDatasetH = void*;

大家都知道,使用void*类型指针前必须先转换成某种确定的类型,如

void *test;
int *a = static_cast<int*>test;//显示转换成int*

void类型指针可以作为函数的参数或者返回值

1:作为参数,一般不关心传递进来的地址类型,比如memset这个函数的原型,memset就是为了将传递进来的地址开始的n个字节的值全部赋值成某个特定的值,所以没必要知道是什么类型的指针,就用void类型指针代替了。

2:作为返回值:一般是返回一个地址,至于这个地址你要做什么用那是你决定的,最常见的就是malloc了,它返回void类型指针作为分配好的内存区的首地址,至于是什么类型,就需要用户自己来指定了。

 

再来看看我们的问题

之前没遇到过这个问题的同学刚开始看到这个绝对会迷糊,这到底是怎么回事?

我们不妨直接把GDALDatasetH 换成void* 来带回到问题中去一下子就理解了

	
      

        void* baseImgDS = GDALOpenShared(baseImgPath,GA_ReadOnly);
	GDALDatasetH regImgDS = GDALOpenShared(regImgPath, GA_ReadOnly);

	void* baseds = baseImgDS;
	void* regds = regImgDS;

这样结合我上面说的关于void*的使用说明,一下子就理解了,其实baseImgDS本来就是一个void*类型的指针,

在声明baseds时,使用void*类型指针,这里又把它转换为void*类型了,这样做看起来是没有意义的,但是只是为了

迎合下面的一个函数的输入,这个函数的输入类型要求是

struct baseRegistrationReturn baseRegistration(GDALDatasetH* baseImgDS, const char * baseImgRpcPath, int baseOX, int baseOY,
	GDALDatasetH* resImgDS, const char * regImgRpcPath, int regOX, int regOY)

看到了吗?输入类型就是GDALDatasetH *,所以这个地方只是为了转换为输入参数的类型而已,如果不是

函数输入要求,这种做法是没有任何意义的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值