-
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复习(预习)双重指针呜呜呜呜呜