解除引用和组件选择之间的区别

时间:2015-01-30 21:32:17

标签: c pointers

在我的示例代码中:

#include <stdlib.h>
#include<stdio.h>    
int main()
{

  typedef struct {float x; float y;}C;

  C z;

  z.x=4;
  z.y=6;

  C *zpt=&z;

  *zpt.x;

  printf("%f",(*zpt).x);
}

我知道(*zpt).xzpt->x用于取消引用指针。但是当我使用*zpt.x时出错,错误 - &#34;请求成员&#39; x&#39;在一些不是结构或联合的东西中#34;有人可以解释*zpt.x做什么吗?这是一个有效的语法,如果是,应该在何处以及如何使用它?

2 个答案:

答案 0 :(得分:4)

这出错*zpt.x;

因为它被解释为

*(zpt.x)

没有任何意义。首先,没有zpt.x,第二,即使这是一个浮点某种方式,你不能在浮点数上使用*

这就是为什么 - &gt;运算符存在:zpt->x(*zpt).x相同,但更易于阅读和输入

答案 1 :(得分:4)

你得到的错误是:

error: request for member ‘x’ in something not a structure or union

当编译器通知您时,zpt既不是结构也不是联合。问题是点运算符(.)的优先级高于星号(*)的优先级,因此首先启用点,因此您会得到错误,因为编译器将其读作:*(zpt.x)

来自C Operator Precedence

  

优先级1 :.结构和联盟成员访问

     

优先级2:*间接(取消引用)

用括号表明你希望运算符如何工作,所以

(*zpt).x

工作得很好,但你会收到这样的警告:

warning: statement with no effect [-Wunused-value]

因为你什么都不做,但我知道这只是测试代码。


我建议阅读相关问题:

Why does the arrow (->) operator in C exist?