链栈二级指针的使用问题以下是某教材的一
楼上的都回答的很好。如果用一级指针函数应该改成这样:
void Push(struct sNode *HS,int x)
{
struct sNode *newp;
newp=malloc(sizeof(struct sNode));
if(newp==NULL){ exit();}
newp->data=x;
newp->next=HS;
HS=newp;
}
现在我们来分析以下如果用上面的的一级指针会出现什么情况。
在函数调用的时候函数体内部会生成实参的副本,到此函数调用结束这个实参副本也自动消亡。也就是说函数体内部的HS并不是传进来的实参HS,只是它们的值是相等的。不妨设实参为H...全部
楼上的都回答的很好。如果用一级指针函数应该改成这样:
void Push(struct sNode *HS,int x)
{
struct sNode *newp;
newp=malloc(sizeof(struct sNode));
if(newp==NULL){ exit();}
newp->data=x;
newp->next=HS;
HS=newp;
}
现在我们来分析以下如果用上面的的一级指针会出现什么情况。
在函数调用的时候函数体内部会生成实参的副本,到此函数调用结束这个实参副本也自动消亡。也就是说函数体内部的HS并不是传进来的实参HS,只是它们的值是相等的。不妨设实参为HS,函数体内部的实参副本为HS1。
因此你在执行上诉函数的时候实际是执行:
newp->next=HS1;
HS1=newp;
而本身的实参的值没有任何改变。
下图为进入函数体时各变量的情况:
-------------- -------------
| top node | | nwe node |
-------------- -------------
^-point-^
|--to----\
|--same---\
----------- ----------
| HS | | HS1 |
----------- ----------
下图为函数执行完毕后的情况:
-------------- -------------
| top node | <--------- | nwe node |
-------------- -------------
^ point------------------^
| to--------------------/
| diffrent-------------/
----------- ----------
| HS | | HS1 |
----------- ----------
由此可以看出虽然你实参副本重新赋值新栈顶节点的地址,但实参并没有重新赋值,实际的栈顶元素还是原来那个栈顶节点,并没有加入新节点。
希望我的回答对你有所帮助。
。收起