深刻理解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隔字节).这样才能做到正确的寻址.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值