首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

【!】建立从1到9的整数链表,并打印

2012-06-09 
【求助!】建立从1到9的整数链表,并打印。C/C++ code#includestdio.h#define INTSIZE sizeof(int)#define NO

【求助!】建立从1到9的整数链表,并打印。

C/C++ code
#include<stdio.h>#define INTSIZE sizeof(int)#define NODESIZE sizeof(int)+sizeof(char *)#define ERROR {printf("error\n");return;}int main(){    int i;    char *p,*q,*first,*malloc();    if((p=malloc(NODESIZE))==NULL)ERROR  /*申请NODESIZE个字节的内存空间,将首地址给p*/    first=p;                             /*设置first为指向链表头的指针*/    *(int *)p=1;                         /*将p强转成int型指针,并对p所指向的变量赋值,即*p=1*/    p+=INTSIZE;                          /*p指针下移两个字节*/    for(i=2;i<10;i++,p+=INTSIZE)              if((q=malloc(NODESIZE))==NULL)ERROR /*为第i个元素申请NODESIZE个字节的内存空间,将首地址给q*/      else                            {         *(char **)p=q;               /*将p强制升级成指向字符的二级指针,并将一级指针q的地址放在p中                                        此时第(i-1)个数据元素的指针域存放的就是第i个节点的地址*/         p=q;                         /*将q赋给p,此时p指向第i个数据元素的首地址*/         *(int*)p=i;                 /*将p强转成int型指针,并将p所指向的变量赋值为i*/         }        *p=NULL;                          /*链表的结尾处指针域为空*/    for(p=first;p;p+=INTSIZE,p=*(char **)p=i) /* 打印链表值*/        printf("%d",*(int *)p);             putchar('\n');                           }

请问,这个程序代码我基本能看懂,但是在 *(char **)p=q; 语句中,为什么要把p强制转换成二级指针呢?本来p指向的是结构体后半部分存放下一个结构地址的空间,这个空间里面存放的是一个地址,如果是**p。那么不就是下一个结构的首地址内的元素了吗?请高手不吝赐教,为什么要把p从一级指针转换到二级指针?谢过!

[解决办法]
探讨

引用:

我发觉楼主好像没有看懂C里面的赋值。i=j是把j赋值给i,OK??
至于为什么要把指针转换成二级指针,我觉得有人在装B。想搞的高深点。
这个我知道,先把获取到的下一个结构的空间首地址赋值给q,然后再赋给p,那么在一个结构的后半部分,我存放的是下一个结构的地址,*p就等于这个地址,那**p不就是跳到下一个结构里面去了吗?

[解决办法]
探讨

引用:

引用:

我发觉楼主好像没有看懂C里面的赋值。i=j是把j赋值给i,OK??
至于为什么要把指针转换成二级指针,我觉得有人在装B。想搞的高深点。
这个我知道,先把获取到的下一个结构的空间首地址赋值给q,然后再赋给p,那么在一个结构的后半部分,我存放的是下一个结构的地址,*p就等于这个地址,那**p不就是跳到下一个结构里面去了吗?
*p是……

热点排行
Bad Request.