学习C ++并解开别人的代码,这一点令我困惑:
ACCOUNTDATA *cd = (ACCOUNTDATA *)*pi
pi最初似乎指向一个类型相同的结构ACCOUNTDATA。
我搜索了SO和其他地方的指针指针,指针和括号(优先顺序),并且使用像这样的括号来输入类型。现在,我不确定它是否是一个指向指针的指针(并且括号是无用的),或者这是一个指向已经类型转换和解除引用的指针,或完全不同的指针。
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;
}
}
答案 0 :(得分:1)
DWORD不是C ++类型,它在<中定义。 windows.h>作为32位无符号整数。 pi是指向DWORD类型变量的指针。它可能具有ACCOUNTDATA类型结构的基址。 在这种情况下,我最好的假设是pi作为指针的指针,指针指向指针的地址,指针又存储ACCOUNTDATA类型结构的基地址。所以* pi只是那个被解除引用的基地址,并且被转换为指向ACCOUNTDATA类型的指针。
就像在一般指针变量中存储结构的地址并将该指针变量的地址传递给其他函数一样。因此,当您需要在被调用函数中访问该地址时,您需要取消引用并将该变量键入caste到特定类型。
答案 1 :(得分:0)
pi已经被类型转换为ACCOUNTDATA指针类型
答案 2 :(得分:0)
pi
是指向The Subtraction Operator algorithm的指针,它是unsigned long
值。由于存在从unsigned long
到指针类型的显式强制转换,反之亦然,因此早期您的代码利用它将ACCOUNTDATA*
转换为DWORD
,然后将其存储在pi
指向的内存中{1}}。您的行首先取消引用pi
的内存,其中包含DWORD
。然后,它会将DWORD
转换回ACCOUNTDATA*
,并将其存储在cd
中。在该行中没有触及实际的ACCOUNTDATA
对象,而是首先取消引用指向它的指针,然后分配存储指向它的指针值的DWORD
的解除引用值转换为另一个变量,返回原始指针类型。