运算符优先级和类型转换如何在这里工作

时间:2014-09-11 02:05:07

标签: c

好的,所以我在这里编写指针并且我不确定这段代码是如何工作的。

typedef struct linkedlist {
    void *obj;
    struct linkedlist *next;
} linkedlist;
linkedlist *p;

//some code here

int *newpointer = (*(int *)(p->next)->obj); //code chunk in question

如果我需要对空指针进行类型转换' obj'在p-> next指向的结构中(假设它已经存在)并将其复制到' newpointer' int指针,我做得对吗?

3 个答案:

答案 0 :(得分:4)

int *newpointer = (*(int *)(p->next)->obj); //code chunk in question
  

如果我需要对空指针进行类型转换' obj'在p-> next指向的结构中(假设它已经存在)并将其复制到' newpointer' int指针,我做得对吗?

没有。编译器会告诉你的。你也不需要所有这些括号:

int *newpointer = (int *)p->next->obj;

答案 1 :(得分:1)

您正尝试使用已转换指针的解除引用值初始化指针newpointer,这是一个错误。 Gcc说:

  

错误:从“int”到“int *”

的转换无效

删除对解除引用运算符的调用:

int *newpointer = (int*) p->next->obj; // Also stripped unnecessary parentheses.

答案 2 :(得分:1)

在C中,类型转换运算符的优先级低于成员访问运算符。因此,

(int*)p->next->obj = (int*)(p->next->obj) = (int*)((p->next)->obj)

如果成员访问运算符的优先级更高,则使用:

int *newpointer = (int*)(p->next->obj);

由于它们不是,你可以省略所有的副作用并使用:

int *newpointer = (int*)p->next->obj;