使用指针在嵌套结构中进行成员访问。箭头运算符等效

时间:2017-04-18 08:46:40

标签: c pointers struct

给出示例是双向链表的代码的一部分。 假设我有给定typedef的以下两个结构。

 typedef struct dplist dplist_t;
 typedef struct dplist_node dplist_node_t;

 struct dplist_node {
   dplist_node_t * prev, * next;
   element_t element;
 };

 struct dplist {
   dplist_node_t * head;
 };

我的主要功能中有以下代码:

 void main()
 {
     dplist_t * list;
     dplist_node_t *node_one, *node_two;

     //the arrow equivalent of the assignment
     list->head = node_one;
     list->head->next = node_two;
 }

我知道node_one赋值的'point'等价于:

 (*list).head = node_one;

但是当我试图找到与node_two赋值相当的'point'时,以下所有变化似乎都是错误的:

 (*list).(*head).next = node_two;
 (*list).*head.next = node_two;
 (*list).head.next = node_two;

有谁知道写这个陈述的正确方法?

2 个答案:

答案 0 :(得分:1)

list->head->next = node_two;可以写成

(*(list->head)).next = node_two;  

可以重写为

(*((*list).head)).next = node_two;

答案 1 :(得分:1)

应为“(*(* list).head).next = node_two;”。

。我假设你故意错过了为你的列表/节点(list = malloc(...))分配内存的行,以保持问题的简短。

。使用 ”。”表示编译器将数据成员作为与已知位置/偏移的偏移量和“ - >”到达表示在运行时(指针)需要取消引用。所以逻辑必须

a)“列表”(*列表)的解除引用地址,

b)计算成员“head”(* list).head,

的偏移量

c)头部的解除引用地址*((* list).head),

d)计算成员“next”的偏移量*((* list).head).next。