链式结构尾插法中2个结构指针P=Q的具体含义

指向还是明白的,就是不明白2个一级指针可以这样操作,该条语句用汇编语言会是怎样?!

同一种类型的指针互相赋值完全没问题,地址也是一种类型的数据,和unsigned int类型差不多。
有时候指针比较乱,一会儿是地址一会儿是指向的内容,尤其是结构体成员当中也出现了指针的时候。其实P和Q本身是独立于链表的体系之外的,它们之间的互相赋值不会折腾到链表本身。但如果有*或者->就不然了。
汇编语言里面好像指针类型的数据都是一个个的相对偏移量。写个现成的C程序在VC里面编译出来,调试的时候打开Disassembly(反汇编)窗口看看这条语句下面的翻译就是了。不过VC编译出来的汇编代码好像很不给力。
我想很可能是通过寻址把Q里面的数据MOV到累加器寄存器(EAX好像习惯用作表达式和函数返回值的暂存场所)里面,然后再MOV到Q的地址单元里去,跟咱们用中间变量来交换的样式的首尾两条差不多。反正肯定要用到一个寄存器,不可能直接在两个内存单元之间操作的。追问

为什么它们之间的互相赋值不会折腾到链表本身?开始定义的是链表的一体!?还是没想明白!很感谢你们的回答

追答

假设有一个函数,利用指针作形参实现交换两个变量的值,如果函数体里面只有P=Q这样的表达式,没有对*P之类的赋值,那就不会折腾到他们原来所指的变量,函数返回后该多少还是多少。
其实我个人觉得链表的插入操作和两个变量的交换操作很类似。看这个程序:
#include
void swap_old()
{//通过指针和中间变量交换两个变量的值
int a=0,b=2;
int *P=&a,*Q=&b,t;
printf("交换前:%d\t%d\n",a,b);
t=*P;
*P=*Q;
*Q=t;
printf("交换后:%d\t%d\n",a,b);
}
void swap_new()
{//通过指针和中间变量将数组中的第二个元素-1交换到末尾位置
int i,a[9];
int *P,*Q,t;
a[0]=0;
a[1]=-1;//把a[1]看成类似于链表结尾的NULL,插入操作相当于交换NULL和新节点的位置
for(i=2;inext指针域赋值)并跟进(指针赋值)。两个外来户离开后,链表不因为他们的离开而消失。

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-11-10
P=Q
就是把Q中地址值传到P中而已,目的暂存Q到P,下一步Q就要变化了,
上一次的值仍暂存在P中以备用。追问

Q的地址是如何保存到P的呢?我一直认为系统给P(结构指针)开的内存空间只来装数据,还有一指针,好像并没有多的空间去暂存Q得地址

追答

你对指针的理解可能没到位。
Q与P仅仅是普遍的变量,其内容只能放一个结构的地址而已,
如果是汇编,仅仅是一个简单的MOV传送指令

第2个回答  2011-11-10
是的
相似回答
大家正在搜