2016-11-18 58 views
0

我知道,如果我在C編程語言中的指針,我必須指向一個結構,我做的:* ptr.member爲什麼是錯誤的,(* ptr).member是正確的?

struct mystruct S; 
struct mystruct *ptr; 
ptr=&S; 
ptr->member=5; 

我明白這一點,但我不明白爲什麼,如果我這樣做的原因:

ptr=&S; 
(*ptr).member=5; 

*ptr應指向該結構的第一個地址,但爲什麼如果我這樣做沒有它的工作:

*ptr.member=5; 
+6

由於[運算符優先級](http://en.cppreference.com/w/c/language/operator_precedence) –

回答

0

你有一個struct和一個指向結構:

struct mystruct S; 
    struct mystruct *ptr; 

現在你在PTR存儲結構的地址

ptr = &S; 

當你需要訪問一個成員的結構通過指針,你有兩種替代語法

(*ptr).member = 5; 

ptr->member = 5; 

兩個語法是相當於一模一樣的動作

只是個人品味的問題。

在你的問題,你有一個錯誤,因爲你寫道:

(*p).member = 5; 

而不是

(*ptr).member = 5; 

因此,錯誤

最後一個建議:

(*ptr).member = 5; 

*ptr.member = 5; 

是不同的東西

(* PTR)。成員= 5;意味着你通過PTR,然後指向的地址存放5名爲領域成員

* ptr.member = 5;意味着您獲得ptr.member指向的地址,然後將5存儲在該地址指向的內存中。

1

如果你有一個STR ucture

struct A 
{ 
    int x; 
}; 

其結構類型

A a; 

然後x你必須寫

a.x = 5; 

或訪問其數據成員的對象,你可以寫

(&a)->x = 5; 

現在,如果你有一個由對象的地址初始化struct A *類型的指針a

struct A *pa = &a; 

則表達式*pa給人的對象a本身。所以你可以寫

(*pa).x = 5; 

所以現在比較一下。一方面

a.x = 5;  and  (*pa).x = 5; 

和在另一方面

(&a)->x = 5; and  pa->x = 5; 
1

由於訪問構件操作員(點)的優先級高於dereferenciation(*)。

所以,你的表情相當於:

*(p.member) = 5 

而且p.member不是指針。

2

運營商擁有precedence:成員訪問運營商.的優先級最高,而取消引用*的優先級次高。因此*p.member會嘗試查找指向mystruct的成員member,然後對其進行解除引用。由於*mystruct沒有名爲member的成員,因此這是一個錯誤。

1

一元*具有比.->成員選擇的優先級高,所以*p.member被解析爲*(p.member);換句話說,你試圖取消p.member的結果。這有兩個問題:

  • p爲指針類型,所以編譯器會抱怨你試圖使用.操作上的東西是不是一個結構或聯合類型;

  • member不是指針類型,這樣你就可以不適用一元*它。

(*p).member相當於p->member;在訪問member之前都取消p

相關問題