0

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

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

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

4

4 回答 4

3

AFAIK,(*p).x 等于 p->x。假设 p 是指向结构的指针,而 x 是结构内的一个字段

于 2013-05-01T00:30:55.263 回答
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;

但是,嵌套结构会变得混乱。诚然,得墨忒耳法则建议你不应该使用其中任何一个,但->下面使用的符号比使用括号、星号和点的符号更容易阅读:

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

* LHS = 左侧

于 2013-05-01T00:42:01.473 回答
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)
于 2013-05-01T01:02:54.423 回答
0

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

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

否则你使用 . :

test myTest;
printf("%d", myTest.x);
于 2013-05-01T00:31:45.373 回答