我已聲明的結構「節點」具有一個成員變量的「m」,然後訪問結構限定兩個變量如下使用指針
struct node t, *p;
在程序後來我分配的t
地址p
:
p = &t;
要訪問成員變量我需要使用p->m
。
但我想使用*
算子,但是編寫它*p.m
會給出錯誤。爲什麼這樣?
我已聲明的結構「節點」具有一個成員變量的「m」,然後訪問結構限定兩個變量如下使用指針
struct node t, *p;
在程序後來我分配的t
地址p
:
p = &t;
要訪問成員變量我需要使用p->m
。
但我想使用*
算子,但是編寫它*p.m
會給出錯誤。爲什麼這樣?
爲此,你必須看到運營商的優先權。
運算符.
的優先級高於*
運算符。
寫它像*p.m
使編譯器認爲它是*(p.m)
。您需要使用(*p).m
。
由於運算符優先級,*p.memberVariable
將不起作用。做(*p).memberVariable
或p->memberVariable
這是因爲operator precedence。
表達式*p.memberVariable
等於*(p.memberVariable)
。即它試圖取消p.memberVariable
作爲指針,而不是p
。這會給你一個編譯器錯誤,因爲p
是一個指向結構的指針,你可以使用點運算符來選擇結構成員。
您需要明確告訴編譯器使用括號取消引用指針p
:(*p).memberVariable
。
嗯...什麼是'a'? –
使用'(* p).memberVariable'。 '.'優先級爲1,'*'優先級爲3. http://en.cppreference.com/w/c/language/operator_precedence – Arkadiy
請問您可以告訴我們*爲什麼要使用解引用操作符?使用它你會在每次你寫的時候再寫兩個字符,對於代碼讀者來說可能並不那麼清楚。 –