C 用(.)或→;操作人员

C 用(.)或→;操作人员,c,struct,operator-keyword,C,Struct,Operator Keyword,伙计们,我对C中的->操作符有点困惑,有人能给我解释一下它是如何工作的,它是如何使用的,以及点和点之间的主要区别吗。运算符和->运算符,此运算符->的名称是什么 另外,我非常需要理解这一点,为了完成一个练习,请解释我或嘲笑我,pdf,视频,教程或其他帮助我的东西,谢谢 int main(int argc, char *argv[]) { struct dashboard{ char name[20]; int idade; }; struct dashboard

伙计们,我对C中的->操作符有点困惑,有人能给我解释一下它是如何工作的,它是如何使用的,以及点和点之间的主要区别吗。运算符和->运算符,此运算符->的名称是什么

另外,我非常需要理解这一点,为了完成一个练习,请解释我或嘲笑我,pdf,视频,教程或其他帮助我的东西,谢谢

int main(int argc, char *argv[]) {

struct dashboard{
    char name[20];
    int idade;      
};

struct dashboard user;

char* n = strcpy(user.name, "anyname");
user.idade = 10;  

printf("Name is: %s and age is: %d", n, user.idade); 

return 0;}
如何使用->实现相同的结构

在各位成员的帮助下回答我的问题

int main(int argc, char *argv[]) {

struct dashboard{
    char name[20];
    int idade;      
};

struct dashboard *user, u;

//Referencing pointer to memory address of u 
user = &u;  

char* n = strcpy(user->name, "anyname");
user->idade = 10;  

printf("Name is: %s, Age is: %d", n, user->idade); 

return 0;

}

点用于结构实例(对象),而->是在使用指针访问结构时使用的。例如,
obj.member
ptr_obj->member
点用于结构实例(对象),当您使用指针访问结构时->为。例如,
obj.member
ptr\u obj->member
dot选择结构的成员。箭头取消引用指向结构的指针,然后拾取成员

struct dashboard user, *up = &user;

. . . user.name . . .
. . . up->name . . .

是等效的(假设向上静止指向用户)。

点拾取结构的成员。箭头取消引用指向结构的指针,然后拾取成员

struct dashboard user, *up = &user;

. . . user.name . . .
. . . up->name . . .

是等效的(假设向上仍然指向用户)。

结构。field
是结构上的字段,很简单<代码>结构->字段相当于
(*结构)。字段
<代码>->当您想要访问指针指向的结构字段时,可以使用它。假设你有这样的结构:

 typedef struct example{
   int field1;
   int field2;
 } ExStructure;
这些变量是:

ExStructure a, *b;

您有一个结构和一个指向结构的指针。如果要访问第一个结构中的字段,只需执行
X=a.field1
。但第二个是指向结构的指针,因此要访问该结构的field1,您需要执行
X=(*b).field1
,这相当于
X=b->field1
。因此
->
使代码更易于阅读

结构。field
是结构上的字段,很简单<代码>结构->字段相当于
(*结构)。字段
<代码>->当您想要访问指针指向的结构字段时,可以使用它。假设你有这样的结构:

 typedef struct example{
   int field1;
   int field2;
 } ExStructure;
这些变量是:

ExStructure a, *b;

您有一个结构和一个指向结构的指针。如果要访问第一个结构中的字段,只需执行
X=a.field1
。但第二个是指向结构的指针,因此要访问该结构的field1,您需要执行
X=(*b).field1
,这相当于
X=b->field1
。因此
->
使代码更易于阅读

->
操作符有点缺少名称。C++调用它:代码>运算符> >代码>,但维基百科称之为“结构引用引用”。
->
操作符有点缺少名称。C++调用它:代码>运算符> >代码>,但维基百科称之为“结构引用引用”。那么,这个代码是正确的?结构仪表板{char name[20];int-idade;};结构仪表板*用户;用户->idade;用户->名称;嗯,不,因为在尝试取消引用之前,你不会让“用户”指向任何东西。您仍然需要为结构实际分配内存。那么,这段代码正确吗?结构仪表板{char name[20];int-idade;};结构仪表板*用户;用户->idade;用户->名称;嗯,不,因为在尝试取消引用之前,你不会让“用户”指向任何东西。您仍然需要为结构实际分配内存。我遵循您的示例,但编译器不起作用,我不确定我是否做错了什么,但在我看来,您缺少了一些额外的解释!因为当我试图用指针*b访问field1时,IDE冻结了。@超级用户我非常怀疑IDE冻结了。好吧,这个例子只是为了说明区别。当您尝试将其作为程序运行时,它可能会冻结(我想您正在windows中工作),因为它会产生分段错误。您必须使用malloc为
*b
分配内存:
b=malloc(sizeof(ExStructure))。请记住,您正在声明指向结构(*b)的指针,但它尚未指向任何内存位置。您也可以让b指向a,然后尝试访问b上的字段,但如果您希望它们是两个不同的结构,则必须使用malloc。@immibis Yes it freeze,因为我没有引用或分配指向指针的内存,您可以使用另一种方法,引用指向另一个地址的指针来访问内存,就像Lee Daniel Crocker所做的那样,不管怎样,这太麻烦了!我遵循您的示例,但编译器不起作用,我不确定我是否做错了什么,但在我看来,您缺少了一些额外的解释!因为当我试图用指针*b访问field1时,IDE冻结了。@超级用户我非常怀疑IDE冻结了。好吧,这个例子只是为了说明区别。当您尝试将其作为程序运行时,它可能会冻结(我想您正在windows中工作),因为它会产生分段错误。您必须使用malloc为
*b
分配内存:
b=malloc(sizeof(ExStructure))。请记住,您正在声明指向结构(*b)的指针,但它尚未指向任何内存位置。您也可以让b指向a,然后尝试访问b上的字段,但如果您希望它们是两个不同的结构,则必须使用malloc。@immibis Yes it freeze,因为我没有引用或分配指向指针的内存,您可以使用另一种方法,引用指向另一个地址的指针来访问内存,就像Lee Daniel Crocker所做的那样,不管怎样,这太麻烦了!