指向类型强制转换和取消引用指针的指针

Pointer to Type Cast & Dereferenced Pointer

本文关键字:指针 取消 引用 转换 类型      更新时间:2023-10-16

学习C++并解开别人的代码,这一点让我感到困惑:

ACCOUNTDATA *cd = (ACCOUNTDATA *)*pi

pi 最初似乎指向相同类型的结构 ACCOUNTDATA。

我已经在 SO 和其他地方搜索了指针到指针、指针和括号(优先级顺序(,并遇到使用这样的括号来键入 cast。现在,我不确定它是指向指针到指针的指针(括号无用(,还是指向已类型转换和取消引用的指针的指针,或者完全是其他东西。

ETA:我尽可能精简相关代码:

typedef struct ACCOUNTDATA_
{
    //declare member data here
}ACCOUNTDATA;
//unrelated code here
BOOL SDMessage(DWORD objID, DWORD *pi, UINT messageID, DWORD param1, DWORD param2)
{
switch (messageID)
{
case SD_CREATE_PLUGIN:
ACCOUNTDATA *cd = (ACCOUNTDATA *)malloc(sizeof(ACCOUNTDATA));
//initialize member data here
*pi = (DWORD)cd;
case SD_SAVE_DATA:
//unrelated code here
ACCOUNTDATA *cd = (ACCOUNTDATA *)*pi;
}
}

DWORD 不是C++类型,它在 中定义为 32 位无符号整数。pi 是指向 DWORD 类型变量的指针。它可能具有 ACCOUNTDATA 类型的结构的基址。在这种情况下,我最好的假设是 pi 用作指针到指针,它存储指针的地址,而指针又存储 ACCOUNTDATA 类型结构的基址。所以 *pi 只不过是被取消引用的基址,并类型转换为指向 ACCOUNTDATA 类型的指针。

这就像您将结构的地址存储在通用指针变量中并将该指针变量的地址传递给其他函数一样。因此,当您需要在调用的函数中访问该地址时,您需要取消引用并将该变量键入特定类型。

pi是一个指向DWORD的指针,这是一个unsigned long值。 由于存在从unsigned long到指针类型的显式强制转换,反之亦然,因此早期您的代码利用它将ACCOUNTDATA*转换为DWORD,然后将其存储在pi指向的内存中。 你的行首先取消引用pi的内存,其中包含一个DWORD。 然后它将该DWORD转换回ACCOUNTDATA*,并将其存储在cd中。 在行中从未接触过实际的ACCOUNTDATA对象,而是首先取消引用指向该对象的指针,然后将存储指向它的指针值的DWORD的取消引用值分配给另一个变量,并强制转换为原始指针类型。

pi 已被类型转换为 ACCOUNTDATA 指针类型