如何在C中使用嵌套结构中的变量指针?

在下面的代码中,如何创建指向变量triangle.pluto.mars.a的指针,因此在printf行中不必重复成员a的整个路径。

#include  int main(){ struct euler { int a; int b; }; struct gauss { int f; int g; struct euler mars; }; struct aristotle{ int x; int y; struct gauss pluto; } triangle; triangle.pluto.mars.a = 151; printf("\nThe value is: %d\n\n",triangle.pluto.mars.a ); return 0; } 

创可贴解决方案:

 int * someVariable = &(triangle.pluto.mars.a); 

长期解决方案:重新设计。

如果您愿意重新安排您的结构,您将有一个更“直观”的方式来访问您的成员。 虽然C不提供inheritance,但它确保指向结构的第一个成员的指针与指向包含结构的指针的值相等。 这允许您通过指针转换来模仿类似行为的inheritance。

  struct euler { int a; int b; }; struct gauss { struct euler mars; int f; int g; }; struct aristotle{ struct gauss pluto; int x; int y; } triangle; triangle.pluto.mars.a = 151; struct euler *e = (void *)▵ struct gauss *g = (void *)▵ printf("\nThe value is: %d\n\n", e->a ); 

该保证在C.11§6.7.2.1¶15中说明(强调我的,并且C.99中存在类似的语言):

在结构对象中,非位字段成员和位字所在的单元具有按声明顺序增加的地址。 指向适当转换的结构对象的指针指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然。 结构对象中可能存在未命名的填充,但不是在其开头。

这并没有消除@ LawrenceAiello的答案 ,这个答案在上面提到的重组之后仍然有效。

 int *num = &(triangle.pluto.mars.a); 

我建议你重新设计你的结构字段作为指针。

 struct euler { int *a; int *b; };