深刻理解C数据结构中的递归定义

在以前,我们定义一个链表结构的时候,一般是这样定义

struct NodeList
{
   someType   NodeData(假定4个字节);
   NodeList*    pNextNodeList;
}
以前非常不理解,NODELIST还没有定义完, pNextNodeList怎么可以递归定义自己的类型呢,就是说用一个未知的类型来定义自身,百思不得其解,其实,也是自己钻死牛角尖了.

现在重新来理解并解释它, NODELIST只是一个指针类型,无论它是什么类型指针,它都占用4个字节的编译存贮空间,也就是说,NODELIST在编译时,能确定自身需要分配的编译空间. 那么此时的NODELIST* 又有什么意义呢?

struct NodeList
{
   someType   NodeData(假定4个字节);
   ......;
   ......;(此处省略到1000个数据项,假定每个数据项4个字节)

   NodeList*    pNextNodeList;
}

结论:NODELIST决定了运行时的链表的寻址操作!

那么如果要查找链表的下一项的时候(每个链表对象占有1008个字节存贮空间), 运行时环境知道如何去定位下一个链表对象, 比如有3个链表对象,A,B,C(用十进制来表示内存地址)
A; 00000000;
B: 00001008:
C:00002016;

当每调用一次currentNodeList->pNextNodeList时,每隔1008隔字节来查找!

说白点,就是那个递归定义的STRUCT类型必须在引用时知道自身的内存占用空间(在32位系统中,指针永远占有4隔字节).这样才能做到正确的寻址.

你可能感兴趣的:(深刻理解C数据结构中的递归定义)