C中的typedef结构初始化,引用它

时间:2013-05-01 00:29:57

标签: c structure

我已经制作了一个typedef结构变量,如下所示:

typedef struct
{
   int x;
   int *someobj;
} test;

我看到有时人们在引用对象或.时使用->,哪一个正确使用? ->仅在初始化类型为test的变量时使用吗?

4 个答案:

答案 0 :(得分:3)

AFAIK,(* p).x等于p-> x。假设p是指向struct的指针,x是struct

中的字段

答案 1 :(得分:2)

当表达式的LHS * 是结构时,使用.;当LHS是指向结构的指针时,使用->。因此,给出:

typedef struct Object { int type; void *data; } Object;

Object  o;
Object *p = &o;

您通常会写:

o.type  = 0;
p->data = 0;

->符号是简写;你也可以写:

(*p).data = 0;

但是,嵌套结构会变得混乱。当然,Law of Demeter建议您不要使用其中任何一种,但使用下面->的符号比使用括号,星号和点的符号更容易阅读:

lhs->data->array[10]->name = 0;
(*(*(*lhs).data).array[10]).name = 0;

* LHS =左侧

答案 2 :(得分:1)

为了简单起见,在结构的情况下,当使用结构变量执行此操作时,使用.运算符引用结构的元素。但是如果使用指向结构的指针变量来引用元素,你使用->运算符。现在让我以你的结构为例来解释这个。虽然我做了一点变化:

typedef struct
{
   int x;
   int *someobj;
} test;

test struct_var,*struct_ptr;

上面的最后一个语句做了两件事。首先,它声明了你提到的结构类型的变量struct_var。第二,它声明了一个指向这样一个结构变量struct_ptr的指针;

现在在下面的语句中,我们将变量的地址分配给指针:

 struct_ptr=&struct_var;

现在要引用结构的元素,我们可以通过以下两种方式实现:

 struct_var.x and  struct_var.someobj    //while using `.` operator

 struct_ptr->x and struct_ptr->someobj      //while using `->` opertor

最后,要取消引用指针元素someobj指向的整数,请使用:

 *(struct_var.someobj)   or  *(struct_ptr->someobj)

答案 3 :(得分:0)

您使用 - >如果变量是指针,如下所示:

test * myTest = (test*) malloc(sizeof(test));
printf("%d", myTest->x);

否则你使用。 :

test myTest;
printf("%d", myTest.x);