|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大家好!首先祝大家新年快乐,万事如意!
像我这样没有回家过年的单身汪,只能在房间里默默的研究代码了。。。。
首先来看看代码
#include <stdio.h>
struct DATA
{
int num;
struct DATA *p;
}data,*sp=&data;
int main()
{
int a=11,b;
sp->p=sp;
sp->num=10;
printf("&data=%d\n",&data);
printf("sp=%d\n",sp);
printf("&sp->num=%d\n",&sp->num);
printf("sp->p=%d\n",sp->p);
printf("sp->num=%d\n",sp->num);
printf("*sp->p=%d\n",*sp->p);
b=*sp->p;/*这里的意思是结构体中的指针p所指向的数值复制给变量b*/
if(a>b)
printf("a>*sp->p\n");
else
printf("a<*sp->p\n");
return 0;
}
如果用红色字体的那样做是行不通的,原因为类型不兼容,从逻辑上讲*p指向的同样是一个整型的数,为什么会不兼容呢?(我猜想可能因为p是结构指指针的原因,这是第一个问题)
上面的方法行不通,那么我们在换一种方法试试看,代码如下:
#include <stdio.h>
struct DATA
{
int num;
struct DATA *p;
}data,*sp=&data;
int main()
{
int a=11;
sp->p=sp;
sp->num=10;
printf("&data=%d\n",&data);
printf("sp=%d\n",sp);
printf("&sp->num=%d\n",&sp->num);
printf("sp->p=%d\n",sp->p);
printf("sp->num=%d\n",sp->num);
printf("*sp->p=%d\n",*sp->p);
if(a>*sp->p)
printf("a>*sp->p\n");
else
printf("a<*sp->p\n");
return 0;
}
代码中红色字体部分,这样也是错误的,原因是'>' : illegal for struct。为什么会提示说‘>’要指向结构呢?(这是第二个问题)。
当然看到这里肯定有人会纳闷,我为什么要用这样的方法呢,
原因是这样的,如果有一个链表B>B>C>E,我想在中间插入D,那么就需要判断D的位置,所以当指针到达C时只能通过这种方式找到E然后比较D是否在C和E之间,不过还用一种方法,就是多定义一个结构指针来指向E。这里我想知道如果我就是要用第一种方法,有什么解决办法么?
- // VC++6.0 Debug模式下 反汇编结果:
- 21: printf("*sp->p=%d\n",*sp->p);
- 004010AF mov eax,[sp (00424a30)]
- 004010B4 mov ecx,dword ptr [eax+4]
- 004010B7 mov edx,dword ptr [ecx+4]
- 004010BA push edx
- 004010BB mov eax,dword ptr [ecx]
- 004010BD push eax
- 004010BE push offset string "*sp->p=%d\n" (00422034)
- 004010C3 call printf (00401140)
- 004010C8 add esp,0Ch
- 上述已经很明显了吧?如果没看过汇编,看下边。
- 还有,指正一点:*p并非指向一个整型的数,而是一个struct DATA.
- 解释:*sp->p '->'比'*'优先级高,所以先(sp->p)获得一个struct DATA*类型,然后'*'操作取得的结果是一个struct DATA结构体类型,并非主观以为的整型。
- // 下边那种情况相同,我也就不多说了
复制代码
|
|