Unit_ptr数据类型的理解

发布时间 2023-11-22 09:42:58作者: taohuaxiaochunfeng

1、相关代码理解

在看代码时,发现有用到  SOCKET

我去找它们的定义,发现有如下定义:

typedef   UINT_PTR  SOCKET

又去看UINT_PTR,LONG_PTR, LONG_PTR的定义,发现有如下定义:

1     typedef _W64 int INT_PTR, *PINT_PTR;
2     typedef _W64 unsigned int UINT_PTR, *PUINT_PTR;
3 
4     typedef _W64 long LONG_PTR, *PLONG_PTR;
5     typedef _W64 unsigned long ULONG_PTR, *PULONG_PTR;

以typedef _W64 int INT_PTR, *PINT_PTR;为例,这里

_W64是编译选项,在64位编译器下, ,而且打开了/Wp64编译选项时,编译器会对使用了__w64的类型进行32位到64位移植性的判断
typedef int INT_PTR => 这里就是为int类型取了一个别名 INT_PTR, 所以这里 INT_PTR就是代表int =》使用 INT_PTR b; b =1;
typedef int *PINT_PTR => 就是为int *,也就是int类型的指针,取了一个别名 PINT_PTR, 所以,这里PINT_PTR就是代表int类型的指针 => 使用 int x = 8; PINT_PTR y = &x;

2、知识扩充

(1)intptr_t 和uintptr_t 类型用来存放指针地址。它们提供了一种可移植且安全的方法声明指针,而且和系统中使用的指针长度相同,对于把指针转化成整数形式来说很有用。

(2)intptr_t是为了跨平台,其长度总是所在平台的位数,所以用来存放地址。

(3)64位机器上指针占8字节,long类型也占8字节,32位机器上指针占用4字节,int类型也占用4字节,所以intptr_t、uintptr_t才这样取别名就是为了能让整数类型与指针互相转换,且注意到为了兼容16位机器,在非64位机器的intptr_t、uintptr_t用int来取别名,而不是long。