访问嵌套结构成员

时间:2015-12-31 10:09:15

标签: c pointers struct

typedef struct struct1 {
      struct struct2 id2;
};  

typedef struct struct2{
     int a;
};   


int fn( struct struct1 *id1)
{

    id1->id2->a=4;
     return 1;
}

错误:fn技术显示错误:错误C2232:'->a':左操作数有' struct'输入'.'

解决方案1:错误消息的帮助

 int fn1( struct struct1 *id1)
{

    id1->id2.a=4;
     return 1;
}

OR

解决方案2:使用struct2指针

int fn2( struct struct1 *id1) 
{
    struct struct2 *id2 = &id1->id2;
    id2->a=4;
     return 1;
}

第二种方法fn2技术也有效。

访问struct2成员的其他可能解决方案是什么?

我想深入了解这个概念。了解我。

2 个答案:

答案 0 :(得分:1)

没有太多方法。一个"其他"方法是使用void *

int fn2( void *id1)  // Called with a 'struct struct1*'
{
    struct struct1 *p = id1;
    void *p2 = p->id2;
    ((struct struct2*)p2)->a=4;
    return 1;
}

但这并非如此。事实上,你拥有的两种方法和这两种方法基本上都是一样的。

唯一的区别是->用于访问指针的成员到struct,其中.用于访问结构的成员。

您可以使用.访问成员并完全避免->

int fn( struct struct1 *id1)
{
    (*id1).id2.a=4;
    return 1;
}

int fn2( struct struct1 *id1) 
{
    struct struct2 id2 = (*id1).id2;
    id2.a=4;
    return 1;
}

->运算符只是方便访问struct指针的成员而不是其他任何内容。

答案 1 :(得分:1)

有两种方法可以访问结构的成员。使用指向结构的指针或结构本身:

struct S {
  int m;
};
struct S s;
struct S *ps = s;

s.m; // direct access through structure
ps->m; // access through pointer to structure
(*ps).m; // direct access of the structure through dereferencing the pointer
(&s)->m; // get address of structure and get member through it

然后,对于您的示例,您可以编写许多不同的内容,如:

id1->id2.a=4;
(*id1).id2.a=4;
(&(id1->id2))->a = 4;
(&((*id1).id2))->a = 4;