当前位置:C++技术网 > 资讯 > windows程序设计 王艳萍版 CSimpleList 类实现中的一个问题

windows程序设计 王艳萍版 CSimpleList 类实现中的一个问题

更新时间:2017-05-17 22:29:19浏览次数:1+次

inline void** CSimpleList::GetNextPtr(void* p) const
{
return (void**)((BYTE*)p + m_nNextOffset);

}

这个函数中 为什么要将参数p转换成BYTE类型?这样做的好处是什么?


C++技术网会员解答:

    您好,感谢您的C++技术网的支持。

    指针是有指向类型的。不同的指向类型,表示指针工作方式不一样。void*指针表示无类型指针,一般默认会处理为char*指针。也就是说,void*指针会按照一个字节为单位进行内存指向移动处理,但是意义不明确。

    void*指针通常会进行类型转换。为什么要使用void*指针呢?在跨线程或跨进程传值等情况下,传递一个具体类型的指针,在数据处理上可能带来不便,因为需要接受具体类型的指针要对应的类型的参数来接受。而传递void*指针则可以规避类型差异问题,可能有时候去定义一个具体类型指针时是不太方便的。所以用void*传参就很方便了。

    反正通过void*指针可以将参数都传过去,指针值不会变,只是表面上代表的意义变了。不过在接受的时候,我们再强制转换为我们之前传递void*时的类型,也就是将指针实际类型还原了。

    为什么要还原呢?不同的指针类型,在运行时是不一样的。char*指针移动的单位是一个字节,int*指针移动的单位是4个字节。如果在事先都是转为void*类型,在接收拾一定要转为对应的实际类型,否则在指针应用时就会出错,比如将int*指针按照void*默认处理解释成4个整数了。就算是我们用作一个字节,一个有符号和无符号类型,在解释上也有差别,结果就造成了巨大差异。

    将参数p转为BYTE*类型,也就是对void*类型的具体化,一般尽量这么做,为了少出错吧。当然,说有什么好处,能不给以后造成隐患就很好了。编程很灵活,特别是C/C++,这个没有固定的模式,这段代码自然还可以有很多种实现方式。

    如果说作者有什么特别的建议或者精妙的地方,可以在文章底部继续留言讨论哦。