我已经制作了一个typedef结构变量,如下所示:
typedef struct
{
int x;
int *someobj;
} test;
我看到有时人们在引用对象或.
时使用->
,哪一个正确使用? ->
仅在初始化类型为test的变量时使用吗?
答案 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);