BU AAOS lab2

  1. exercise2.1关键在于对双重指针的理解,在花了很长时间搞懂后,作图如下

    LIST_INSERT_BEFORE为例,给插入前listelm的前一个元素命名为before

    规定每个”元素“用一个大矩形框表示,每个矩形框划分为两部分。一部分“标题框”表示“地址”,另一部分表示“内容”

    • 如下图,是插入前的图示

      BU AAOS lab2_第1张图片

    • 宏函数第一行(elm)->field.le_prev = (listelm)->field.le_prev;

      listelmprev赋给elmprev,也就是说让elmprev值等于beforenext地址

    BU AAOS lab2_第2张图片

    • 第二行LIST_NEXT((elm), field) = (listelm);

      最易理解的一步,elm的next指针指向listelm

      BU AAOS lab2_第3张图片

    • 第三行*(listelm)->field.le_prev = (elm);

      一步一步解析,listelmprevbeforenext的地址,那么给这个东西做 ***** 运算,得到的等式左边的就是beforenext的“内容”(区别于地址)。因此这句话的意思就可以理解为让beforenext等于elm的地址,也可以说成让beforenext指向elm

    BU AAOS lab2_第4张图片

    • 第四行(listelm)->field.le_prev = &LIST_NEXT((elm), field);

      这行代码左侧与上一行的区别就在于没有做 * 运算,因此等式左边就表示listelmprev。我们看前一张图可知,原先这个等于beforenext的地址,现在我们通过赋值把他更改为elmnext的地址。然后就大功告成啦~!

      BU AAOS lab2_第5张图片

lab1复习指针,lab2复习(预习)双重指针呜呜呜呜呜

你可能感兴趣的:(BU AAOS lab2)