好的,所以我在这里编写指针并且我不确定这段代码是如何工作的。
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指针,我做得对吗?
答案 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;