2016-11-18 55 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

相关问题