-
exercise2.1关键在于对双重指针的理解,在花了很长时间搞懂后,作图如下
以LIST_INSERT_BEFORE为例,给插入前
listelm
的前一个元素命名为before
。规定每个”元素“用一个大矩形框表示,每个矩形框划分为两部分。一部分“标题框”表示“地址”,另一部分表示“内容”
-
如下图,是插入前的图示
-
宏函数第一行
(elm)->field.le_prev = (listelm)->field.le_prev;
将
listelm
的prev
的值赋给elm
的prev
,也就是说让elm
的prev
值等于before
的next
的地址
-
第二行
LIST_NEXT((elm), field) = (listelm);
最易理解的一步,
elm
的next指针指向listelm
-
第三行
*(listelm)->field.le_prev = (elm);
一步一步解析,
listelm
的prev
是before
的next
的地址,那么给这个东西做 ***** 运算,得到的等式左边的就是before
的next
的“内容”(区别于地址)。因此这句话的意思就可以理解为让before
的next
等于elm
的地址,也可以说成让before
的next
指向elm
-
第四行
(listelm)->field.le_prev = &LIST_NEXT((elm), field);
这行代码左侧与上一行的区别就在于没有做 * 运算,因此等式左边就表示
listelm
的prev
的值。我们看前一张图可知,原先这个值等于before
的next
的地址,现在我们通过赋值把他更改为elm
的next
的地址。然后就大功告成啦~!
-
lab1复习指针,lab2复习(预习)双重指针呜呜呜呜呜