LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3481|回复: 18

函数返回后,地址怎么变了

[复制链接]
发表于 2003-6-30 22:51:31 | 显示全部楼层 |阅读模式
  1. typedef struct Node
  2. {
  3.         int i;
  4.         struct Node *next;
  5. }NodeDef;
  6. /*找出链表中,p->i最大者,并取出链表。*/
  7. NodeDef *findmax(NodeDef *head)
  8. {
  9.         NodeDef *premax,*max,*pretmp,*tmp;
  10.         max=head;
  11.         pretmp=head;
  12.         tmp=head->next;
  13.         premax=NULL;
  14.         while(tmp!=NULL)
  15.         {
  16.                 if((max->i)<(tmp->i))
  17.                 {
  18.                         max=tmp;
  19.                         premax=pretmp;
  20.                 }
  21.                 pretmp=tmp;
  22.                 tmp=tmp->next;
  23.         }
  24.         if(max!=head)
  25.                 premax->next=max->next;
  26.         else
  27.                 head=head->next;//函数返回后,head又变回原来的了?:help
  28.         return max;
  29. }
复制代码
 楼主| 发表于 2003-6-30 22:52:20 | 显示全部楼层
如图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2003-6-30 23:36:18 | 显示全部楼层
源程序大意是把链表中的最大单元提出来,并且在删除链表里的
这个max Node的连接,单并没有删除这个单元,然后返回这个max

例如:如果当前head是最大值,那就返回的max指向原来的head,
而原来的head->next成为了新的head了,所以head地址也变了。

注释里面也说/*找出链表中,p->i最大者,并取出链表。*/
不知我说的对不对
发表于 2003-6-30 23:53:22 | 显示全部楼层
的确很奇怪。明明已经把head删除掉了。而且在函数里已经看到head的地址变化了,怎么还是原来的地址呢?
发表于 2003-7-1 00:02:13 | 显示全部楼层
我想是不是要node **head
head是指针,修改它,应该要指向指针的指针了
发表于 2003-7-1 00:03:05 | 显示全部楼层
NodeDef *findmax(NodeDef *head)
你的 head 传进来的是值参,她并不会改变调用该函数的地方的那个变量。就好像
int change(int n);
运行下面程序以后,n并不会改变的。
int n;
change(n);
发表于 2003-7-1 07:37:08 | 显示全部楼层
NodeDef *findmax(NodeDef *head)
这里不是对指针进行操作吗?而且返回的是一个地址。就像 int findmax(int *a,int *b). 调用findmax(&a,&b)一样。
这个问题我也遇到过。
发表于 2003-7-1 09:23:24 | 显示全部楼层
问题是这个参数的值是一个指针而不是一个整数,那么想要改变这个指针的话,就要传递一个指针的指针了。
发表于 2003-7-1 12:06:37 | 显示全部楼层
同意viper兄的意见。
发表于 2003-7-1 12:55:42 | 显示全部楼层
呵呵,看来是对参数传递不太清楚。
参数传递一般有两种方式,传值和传引用,在c里只有传值调用,没有传引用,别听一些书上讲的什么传地址,把概念都搞混了,
int f(int a);
int f(int *a);
都是传值,第一个的值类型是int,第二个的值类型是int *,
对于第二个,你可以通过*a改变a指向的地址的值,但不能通过a改变传入的实参的值。
一般来说,在int f(int a)函数里我们都不会写a = nnn;之类的语句,因为这一般都没什么用,除非有人用完了a以后又把它当作一个局部变量来用,不过这样做容易把人搞糊涂。
同理在int f(int *a)里如果出现a = xxx;之类的语句,这一般都是一个错误。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表