添加指针的目的是什么:typedef unsigned char UCHAR, *PUCHAR;

问题描述

在:typedef unsigned char UCHAR,*PUCHAR;添加指针的目的是什么 (还有很多其他带有附加指针的 typedef 示例)我发现 UCHAR 旁边是 *PUCHAR 指针并检查了 sizeof(UCHAR) 和 sizeof(PUCHAR) 结果是 1 字节和 8 字节。这个指针大小是固定的还是灵活的?在一行中使用不同大小的数据类型制作 typedef 是否正确?如果操作系统将来将寻址扩展到 128 位(16 字节)会怎样?

在确定地址正在扩展的情况下,制作这么多数据类型的目的是什么?

typedef unsigned char UCHAR,*PUCHAR;

(...)

  2.2.16 HANDLE
  2.2.17 HCALL
  2.2.18 HRESULT
  2.2.19 INT
  2.2.20 INT8
  2.2.21 INT16
  2.2.22 INT32
  2.2.23 INT64
  2.2.24 LDAP_UDP_HANDLE
  2.2.25 LMCSTR
  2.2.26 LMSTR
  2.2.27 LONG
  2.2.28 LONGLONG
  2.2.29 LONG_PTR
  2.2.30 LONG32
  2.2.31 LONG64
  2.2.32 LPCSTR
  2.2.33 LPCVOID
  2.2.34 LPCWSTR
  2.2.35 LPSTR
  2.2.36 LPWSTR
  2.2.37 NET_API_STATUS
  2.2.38 NTSTATUS
  2.2.39 PCONTEXT_HANDLE
  2.2.40 QWORD
  2.2.41 RPC_BINDING_HANDLE
  2.2.42 SHORT
  2.2.43 SIZE_T
  2.2.44 STRING
  2.2.45 UCHAR
  2.2.46 UINT
  2.2.47 UINT8
  2.2.48 UINT16
  2.2.49 UINT32
  2.2.50 UINT64
  2.2.51 ULONG
  2.2.52 ULONG_PTR
  2.2.53 ULONG32
  2.2.54 ULONG64
  2.2.55 ULONGLONG
  2.2.56 UNICODE
  2.2.57 UNC
  2.2.58 USHORT
  2.2.59 VOID
  2.2.60 WCHAR
  2.2.61 WORD

解决方法

UCHAR 代表 unsigned char,大小为 1 个字节。 PUCHAR 代表 unsigned char*。要存储指针,您需要 8 个字节(在 64 位应用程序中)。这就是为什么UCHAR的大小是1个字节,PUCHAR的大小是8个字节的原因。

为什么一个指针是 8 个字节?
那是因为在 64 位应用程序中,单个字节的地址有 64 位。为了表示这一点,您需要 64 位。这就是为什么它需要 8 位。

我们不能只使用 *char 而不是 *PUCHAR 或者它可能是制作如此多数据类型的某种隐藏含义吗?

*PUCHARunsigned char**,而不是 char*。但是,如果我正确理解您的问题并且您的意思是“使用 unsigned char* 而不是 PUCHAR”,是的,您可以。但前提是您了解底层类型。

开发人员采用这样的自定义 typedef 的原因可能很少。可能是为了适应多个平台、适应不同的架构、个人意见等......如果不知道真正的底层类型,我们实际上可能会在转换为另一种类型的过程中丢失信息。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...