首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么*ptr.member错了(*ptr).member是对的?

为什么*ptr.member错了(*ptr).member是对的?
EN

Stack Overflow用户
提问于 2016-11-18 21:42:30
回答 4查看 125关注 0票数 0

我知道,如果我在C编程语言中有一个指针,并且我必须指向一个结构,我就知道:

代码语言:javascript
复制
struct mystruct S;
struct mystruct *ptr;
ptr=&S;
ptr->member=5;

我明白这一点,但我不明白为什么,如果我这样做:

代码语言:javascript
复制
ptr=&S;
(*ptr).member=5;

*ptr应该指向结构的第一个地址,但是如果我这样做,它为什么不能工作:

代码语言:javascript
复制
*ptr.member=5;
EN

回答 4

Stack Overflow用户

发布于 2016-11-18 21:49:03

操作符有优先:成员访问操作符.具有最高的优先级,而取消引用*的优先级次之。因此,*p.member试图找到指向mystruct的指针的成员member,然后取消引用它。因为*mystruct没有一个名为member的成员,所以这是一个错误。

票数 2
EN

Stack Overflow用户

发布于 2016-11-18 21:47:50

如果你有一个结构

代码语言:javascript
复制
struct A
{
    int x;
};

和结构类型的对象。

代码语言:javascript
复制
A a;

然后,要访问它的数据成员x,您必须编写

代码语言:javascript
复制
a.x = 5;

或者你可以写

代码语言:javascript
复制
( &a )->x = 5;

现在,如果有一个类型为struct A *的指针,该指针由对象a的地址初始化。

代码语言:javascript
复制
struct A *pa = &a;

然后表达式*pa给出对象a本身。所以你可以写

代码语言:javascript
复制
( *pa ).x = 5;

所以现在比较一下。一方面,一方面

代码语言:javascript
复制
a.x = 5;       and      ( *pa ).x = 5;

另一方面

代码语言:javascript
复制
( &a )->x = 5; and      pa->x = 5;
票数 1
EN

Stack Overflow用户

发布于 2016-11-18 21:48:08

因为对成员运算符(点)的访问优先于取消引用(*)。

因此,您的表达式相当于:

代码语言:javascript
复制
*(p.member) = 5

p.member不是指针。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40686387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档