有关指针和地址传递的问题

baigoohao 2010-08-10 07:12:41
我先定义一个结构体
typedef struct Node {
DataType data;
struct Node *next;
}ListNode,*LinkList;

然后在main()函数中定义三个变量;分别为
ListNode *LA,*LB,*LC;

后面写了一个归并函数
void MergeList(LinkList A, LinkList B,LinkList C)
{
ListNode *pa,*pb,*pc;
pa=A->next;
pb=B->next;
C=A;
pc=C;
while(pa&&pb)
{
if(pa->data<=pb->data)
{
pc->next=pa;
pc=pc->next;
pa=pa->next;
}
else
{
pc->next=pb;
pc=pc->next;
pb=pb->next;
}
}
pc->next=pa?pa:pb;
free(B);
}


在main()函数调用时,传递的参数形式为:
MergeList(LA,LB,LC)

问题来了,调试、编译都没问题,但就是运行出现错误。

而把MergeList()函数的第三个(C)形参类型改为
MergeList(LinkList A,LinkList B,LinkList *C)

函数体内的C也都改为
*C;
*C;
在main()函数传递形式为:
MergeList(LA,LB,&LC);

结果就正确了!
小弟能力有限,还没想明白这时为什么?
请高手帮忙看一下!
...全文
117 点赞 收藏 14
写回复
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
错_对 2010-08-12
估计你顺序表学的优点苦闷了
回复
baigoohao 2010-08-12
[Quote=引用 12 楼 michael122 的回复:]
lz还是好好看看C语言的语法吧。。
这是引用啊,形式跟传值一样,效果跟指针一样


引用 9 楼 baigoohao 的回复:

引用 7 楼 michael122 的回复:
void MergeList(LinkList A, LinkList B,LinkList&amp;amp; C)

改成这样应该就行了,其他代码不需要改了

可以说下 为什么在LinkLis……
[/Quote]
谢谢···
回复
michael122 2010-08-10
lz还是好好看看C语言的语法吧。。
这是引用啊,形式跟传值一样,效果跟指针一样

[Quote=引用 9 楼 baigoohao 的回复:]

引用 7 楼 michael122 的回复:
void MergeList(LinkList A, LinkList B,LinkList&amp; C)

改成这样应该就行了,其他代码不需要改了

可以说下 为什么在LinkList后加一个&,我不明白···
[/Quote]
回复
mxh2010 2010-08-10
指针真是方便!
回复
toplinq 2010-08-10
在这里&表示引用,不表示取地址。在函数中,就是引用传值,在C++语言的语法中,引用是该变量的别名,在本例中,改变了C的引用,也就改变了C的本身,两个是一回事,如果采用用C语言的话,那么只能采用地址的地址的方式了,可以传入C的地址,也是可以的。

[Quote=引用 9 楼 baigoohao 的回复:]

引用 7 楼 michael122 的回复:
void MergeList(LinkList A, LinkList B,LinkList&amp; C)

改成这样应该就行了,其他代码不需要改了

可以说下 为什么在LinkList后加一个&,我不明白···
[/Quote]
回复
baigoohao 2010-08-10
[Quote=引用 7 楼 michael122 的回复:]
void MergeList(LinkList A, LinkList B,LinkList& C)

改成这样应该就行了,其他代码不需要改了
[/Quote]
可以说下 为什么在LinkList后加一个&,我不明白···
回复
baigoohao 2010-08-10
[Quote=引用 6 楼 baigoohao 的回复:]
是这样··LinkList MergeList(LinkList A, LinkList B,LinkList C)
[/Quote]
可以说下 为什么在LinkList后加一个&,我不明白···
回复
michael122 2010-08-10
void MergeList(LinkList A, LinkList B,LinkList& C)

改成这样应该就行了,其他代码不需要改了
回复
baigoohao 2010-08-10
是这样··LinkList MergeList(LinkList A, LinkList B,LinkList C)
回复
baigoohao 2010-08-10
[Quote=引用 4 楼 michael122 的回复:]
这是一种
或者不用动代码,函数声明改成传C的引用也行
[/Quote]
怎样做··不明白···
回复
michael122 2010-08-10
这是一种
或者不用动代码,函数声明改成传C的引用也行
回复
baigoohao 2010-08-10
[Quote=引用 1 楼 michael122 的回复:]
void MergeList(LinkList A, LinkList B,LinkList C)
问题出在这句: C=A;
你只把C按值传过去了,这样函数里对C的操作都是不能改变你的实参的,除非你return C。也就是说,你这个函数里做的东西全都白做了,LC还是没变!

你做的改动是一种解决办法,还是一种就是在函数末尾 return C;然后赋值给LC
[/Quote]
改变是把C全变成*C
回复
Freeze_Z 2010-08-10
如果将C作为新的链表输出,则有改变C的值.
所以需要传递其指针, 即 LinkList *.
只传LinkList无法改变C的值.

回复
michael122 2010-08-10
void MergeList(LinkList A, LinkList B,LinkList C)
问题出在这句: C=A;
你只把C按值传过去了,这样函数里对C的操作都是不能改变你的实参的,除非你return C。也就是说,你这个函数里做的东西全都白做了,LC还是没变!

你做的改动是一种解决办法,还是一种就是在函数末尾 return C;然后赋值给LC
回复
发动态
发帖子
数据结构与算法
创建于2007-08-27

3.2w+

社区成员

数据结构与算法相关内容讨论专区
申请成为版主
社区公告
暂无公告