簡體   English   中英

運算符優先級和類型轉換在這里如何工作

[英]How does operator precedence and typecasting work here

好的,所以我在這里編寫指針的工作,並且不確定這段代碼如何工作。

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

//some code here

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

如果我需要在p-> next所指向的結構中類型轉換void指針'obj'(假設它已經存在)並將其復制到'newpointer'int指針,我是否正確?

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

如果我需要在p-> next所指向的結構中類型轉換void指針'obj'(假設它已經存在)並將其復制到'newpointer'int指針,我是否正確?

不。編譯器會告訴您的。 您也不需要所有這些括號:

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

您正在嘗試使用轉換指針的取消引用值初始化指針newpointer ,這是一個錯誤。 海灣合作委員會說:

錯誤:從“ int”到“ int *”的無效轉換

刪除對取消引用運算符的調用:

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

在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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM