4

所以我正在尝试将一张牌添加到玩家的手牌中......并且只有在我对顶部和最后一张牌使用双指针时,这张牌的值才会被传递回主函数。但是 last->pt 不能转换为 temp,我该如何解决这个问题?

typedef struct card_s
{
char suit[9];
int value;
struct card_s *pt;
} card;

void deal_card(card **top, card **last, card dealt)
{
card *temp;

temp = (card*)malloc(sizeof(card));
strcpy(temp->suit, dealt.suit);
temp->value = dealt.value;

if(*top == NULL)
    *top = temp;
else
    *last->pt = temp; //FIX ME - something is going wrong at this point
*last = temp;
last->pt = NULL; //FIX ME - same problem as above
}
4

2 回答 2

2

问题似乎是运算符优先级,因此使用括号应该可以解决它:

(*last)->pt = temp;

它最初的编写方式是将其last视为(单个)指针,并尝试取消引用 member pt。相反,您想取消引用last,然后访问pt结果指针的成员。

于 2013-12-08T00:34:36.180 回答
2

由于指向结构的指针很常见,并且上面示例中的括号很麻烦,因此还有另一个结构选择运算符适用于指向结构的指针。如果 p 是指向结构的指针并且 m 是该结构的成员,则

p->m

选择指向结构的那个成员。因此,表达式 p->m 完全等价于

(*p).m

另一方面,您正在使用一些模糊的组合。使用任何一种格式。例如last->pt(*last).pt

这些行还包含我相信不属于那里的星号:

if(*top == NULL)
    *top = temp;
else
    *last->pt = temp; //FIX ME - something is going wrong at this point
*last = temp;

总之,这应该有效:

if(top == NULL)
    top = temp;
else
    last->pt = temp;
last = temp;

(假设您要更改指针指向的地址。如果您在它前面使用星号,则您正在与指针指向的实际值进行比较/分配。

于 2013-12-08T00:36:30.327 回答