指针链表能用数组方式访问吗?神奇呀

kzy04 2007-09-06 01:26:22
各位大侠:有段代码好像是指针链表能用数组方式访问,求解惑:
注:以下引用的程序为p2p开源项目源码,代码本身没有问题,编译后可正常运行。
1、变量类型定义
struct ServerDesc
{
int flag;
int sock;
int type;
int cur;
int max;
int maxid;
struct Session *head;
int (*init) (int listnum);
int (*process) (int listnum);
int (*closure) (int listnum);
};
struct Session
{
int type;
int socket;
unsigned int host;
unsigned int port;
unsigned int numjob;
struct JobDes *head;
struct Channel *pc;
struct Edge *header;
struct Session *next;
};
struct ServerDesc TRACKER[MAX_TYPE];

2、部分代码段
while (TRACKER[type].maxid == listnum && TRACKER[type].head[listnum].socket == 0 && listnum > 0)
{
listnum --;
TRACKER[type].maxid --;
}
3、我的问题
在serverdesc定义中head定义为struct Session *head;
head没有被定义成数组呀,怎么可以当数组用呀?
谢谢赐教!!
...全文
407 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
xmoon1983 2007-09-06
  • 打赏
  • 举报
回复
mark 学习
yanglin5131421 2007-09-06
  • 打赏
  • 举报
回复
送分了
===============================
哪位同学来帮帮我 ,下边是我的求助贴,都别灌水了,来看看我的这个问题 ,谢谢
http://community.csdn.net/Expert/topic/5746/5746261.xml?temp=.5913965
kzy04 2007-09-06
  • 打赏
  • 举报
回复
zhji09(赵江):你给的分总和不对是怎么回事
zhji09 2007-09-06
  • 打赏
  • 举报
回复
我告诉你 怎么加分,不是说我为了分数而来,
而是,告诉你,即使以后遇到问题了,
那么,一样也要给其他帮助解决问题的兄弟们分数的
----游戏规则
点击管理
就会看到,记得填写密码
zhji09 2007-09-06
  • 打赏
  • 举报
回复
不谢
kzy04 2007-09-06
  • 打赏
  • 举报
回复
请问,我要给zhji09(赵江) 加分,怎么操作呀

kzy04 2007-09-06
  • 打赏
  • 举报
回复
多谢zhji09(赵江) ,你说的对,系统在开始时预分配了连续空间,多谢
zhji09 2007-09-06
  • 打赏
  • 举报
回复
你看看他的地址申请那里,仔细看看,
如果不是生成了一个绝对大的空间的地址--绝对的含义:程序生成人员这个地址空间要容纳的内容最大的量的一个大于等于值;
要么就是上面我描述的那样:每次增加内容的时候,判断地址空间的大小,
如果不够了,那么就重新生成一个更大的新的地址,然后把旧地址中的内容复制到新的地址,释放原来的地址,
应该是这样的
zhji09 2007-09-06
  • 打赏
  • 举报
回复
我没有讨论出什么问题了,
只是在说,如果是指针的方式的话,
那么,不管存储的是链表--限于顺序存储的链表--还是什么内容,
只要你知道他的头指针的话--只要他在内存中是顺序存储的--那么这样引用是没有任何问题的

如果,对指针、地址、数组--其实就是用地址--或者这个地址的变量(数组下表)访问 内存地址上的内容,把握住这一点
应该不难理解!
kzy04 2007-09-06
  • 打赏
  • 举报
回复
这段代码是在suselinux上跑的,应该是一个比较典型的环境,编译器更是标准的
zhji09 2007-09-06
  • 打赏
  • 举报
回复
向上面的代码,多半是在生成链表的时候对地址空间的申请进行了限制,
限制的最终结果就是:生成了一个连续的地址空间来存储这个链表,
当然这里肯定还会涉及链表内容增加等,空间不够时再申请那么又是一个连续的地址空间
把原来地址上的内容拷贝到新的地址空间等等的,
kzy04 2007-09-06
  • 打赏
  • 举报
回复
谢Wolf0403。现在的问题是根本就没有T arr[]这样的定义呀,它就直接用了。
zhji09 2007-09-06
  • 打赏
  • 举报
回复
即使是链表也有两种存储方式的,
第一种是最简单的,顺序存储---这样的方式的存储的话,那么就可以用数组下表方式、头指针增加偏移量等的方法来访问,
第二种是链式存储,这种方法来存储的话,就会出问题了,
出什么问题,和操作系统,编译平台有关了吧,

Wolf0403 2007-09-06
  • 打赏
  • 举报
回复
对任意类型 T,有 T *p 或 T arr[],且有整数 n

p[N] 等价于 *(p + N)
p[-N] 等价于 *(p - N)
arr[N] 等价于 *(arr + N)
kzy04 2007-09-06
  • 打赏
  • 举报
回复
有能给个答案的大虾吗,急呀
kzy04 2007-09-06
  • 打赏
  • 举报
回复
wanfustudio:给个说法吧
kzy04 2007-09-06
  • 打赏
  • 举报
回复
不知是不是没有看懂原代码,但用数组形式直接访问链表个元素一定不可以呀?晕
飞哥 2007-09-06
  • 打赏
  • 举报
回复
大惊小怪
kzy04 2007-09-06
  • 打赏
  • 举报
回复
同意Treazy()的观点
kzy04 2007-09-06
  • 打赏
  • 举报
回复
现在的问题是指针链表被用数组方式引用了!!根本就没有关于head[]数组的定义,却用head[listnum]来当作指针引用
加载更多回复(4)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧