关于无类型指针的命名问题

发布于 2022-09-01 06:45:45 字数 408 浏览 17 评论 0

在使用C++写程序时,有时候会把指针像普通变量一样传来传去,而不考虑指针指向的具体类型,仅仅把它当做一个普通的4字节/8字节变量,我这里就称之为无类型指针了;
早在C语言中,因为没有template一类的东西,所以其库函数qsort中的cmp被设计为接受两个任意类型指针(无类型指针),其使用的类型为void*
但是我平时也看到一些程序中,无类型指针使用了类型UINT_PTR
想知道void*UINT_PTR这两种类型(虽然大小是一样的),哪个更加常用,或者说写起来更好一些。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

扬花落满肩 2022-09-08 06:45:45

首先,UINT_PTR不是无类型指针,不要被它的名字迷惑了——它其实是个unsigned int。定义如下:

#if  defined(_WIN64)

typedef unsigned __int64 UINT_PTR; 

#else

typedef unsigned int UINT_PTR; 

#endif

为什么要定义这个类型?原因倒是和指针相关的——用来存储指针。根据定义可以看出,uint_ptr的大小足够存储指针。有什么用呢?比如说,你要把一个指针转为unsigned int,强制转换的话会有风险。假如你机器上的unsigned int和指针长度恰好相等,那没问题。如果不相等,比如说unsigned int长度比指针短,转换过程中就会丢数据了。long一般表示机器字长,但是int和unsigned int没这个保障。

void*的设计目的就不是这个了,主要是基于通用性考虑的,正如你问题中提到的那些函数,都用了void指针。所以比较它们两个其实意义不大。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文