我制作了一个 typedef 结构变量,如下所示:
typedef struct
{
int x;
int *someobj;
} test;
我看到有时人们.
在引用对象时使用 或->
,使用哪个正确?->
仅在初始化类型为 test 的变量时使用?
AFAIK,(*p).x 等于 p->x。假设 p 是指向结构的指针,而 x 是结构内的一个字段
当表达式.
的 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 = 左侧
为了简单起见,在结构的情况下,.
当您使用结构变量来执行此操作时,您使用运算符来引用结构的元素。但如果您使用指向结构变量的指针来引用元素,则使用->
操作员。现在让我以您的结构为例进行解释。不过,我正在做一些细微的变化:
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)
如果变量是指针,则使用 ->,如下所示:
test * myTest = (test*) malloc(sizeof(test));
printf("%d", myTest->x);
否则你使用 . :
test myTest;
printf("%d", myTest.x);