【问题标题】:Struct in C with (.) or → operator使用 (.) 或 → 运算符在 C 中构造结构
【发布时间】:2015-02-18 22:18:56
【问题描述】:

伙计们,我对 C 中的 -> 运算符有点困惑,有人可以向我解释它是如何工作的以及如何使用它,以及 dot 之间的主要区别。运算符和 -> 运算符,这个运算符的名称是什么 -> ?

附:我非常需要理解这一点,要完成一个练习,请解释我或给我,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;}

如何使用 -> 实现相同的结构?

在 stackoverflow 成员的帮助下回答我的问题。

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;

}

【问题讨论】:

标签: c struct operator-keyword


【解决方案1】:

Point 用于结构实例(对象),-> 用于使用指针访问结构。例如。 obj.memberptr_obj->member

【讨论】:

    【解决方案2】:

    点选择结构的成员。箭头取消引用指向结构的指针,然后选择一个成员。

    struct dashboard user, *up = &user;
    
    . . . user.name . . .
    . . . up->name . . .
    

    是等价的(假设 up 仍然指向用户)。

    【讨论】:

    • 那么,这段代码正确吗?结构仪表板{字符名称[20];了解; };结构仪表板*用户;用户->idade;用户->名称;
    • 嗯,不,因为在尝试取消引用之前,您不会让“用户”指向任何内容。您仍然需要为结构实际分配内存。
    【解决方案3】:

    structure.field是结构体上的字段,就这么简单。 structure->field 等价于 (*structure).field-> 当您想要访问由您拥有的指针指向的结构的字段时使用它。想象一下你有这样的结构:

     typedef struct example{
       int field1;
       int field2;
     } ExStructure;
    

    这个变量:

    ExStructure a, *b;
    

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

    【讨论】:

    • 我按照您的示例进行操作,但编译器无法正常工作,我不确定我是否做错了什么,但在我看来,您缺少一些额外的解释!因为当我尝试使用指针 *b 访问 field1 时,IDE 冻结了。
    • @superuser 我非常怀疑 IDE 会死机。
    • 好吧,这个例子只是为了向你展示不同之处。当您尝试将其作为程序运行时,它可能会冻结(我猜您是在 Windows 中工作),因为它给出了分段错误错误。您必须使用 malloc: b=malloc (sizeof (ExStructure) );*b 分配内存。请记住,您正在声明指向结构 (*b) 的指针,但它还没有指向任何内存位置。您也可以让 b 指向 a,然后尝试访问 b 上的字段,但如果您希望它们是两个不同的结构,则必须使用 malloc。
    • @immibis 是的,它冻结了吗,因为我没有为指针引用或分配内存,而 angel208 你可以使用另一种方式,引用指向另一个地址的指针来访问内存,就像 Lee Daniel Crocker 所做的那样,无论如何非常感谢!
    猜你喜欢
    • 2012-04-16
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 2011-02-20
    相关资源
    最近更新 更多