在以前,我们定义一个链表结构的时候,一般是这样定义
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隔字节).这样才能做到正确的寻址.
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隔字节).这样才能做到正确的寻址.