| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 991 人关注过本帖
标题:关于指针的调用问题
只看楼主 加入收藏
ldliming
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2006-8-12
收藏
 问题点数:0 回复次数:15 
关于指针的调用问题
下面两个函数的功能是都是想实现两个数值的交换,但是为什么第一个不能实现,而第二个能实现呢?还望高手们指教!!! 拜托!谢谢!!!!!!!!!!!!
(1)
main()
{
void rub(int *p1,int *p2);
int x,y;
int *p1,*p2;
x=1,y=2;
p1=&x,p2=&y;
rub(p1,p2);
printf("%d,%d\n",*p1,*p2);
}
void rub(int *p1,int *p2)
{
int *p;
p=p1; //交换地址即交换指针的指向,为什么不能实现两个数值的交换呢?
p1=p2;
p2=p;
printf("%d,%d\n",*p1,*p2);
}
(2)
main()
{
void rub(int *p1,int *p2);
int x,y;
int *p1,*p2;
x=1,y=2;
p1=&x,p2=&y;
rub(p1,p2);
printf("%d,%d\n",*p1,*p2);
}
void rub(int *p1,int *p2)
{
int p;
p=*p1; //交换指针所指数据的内容则可以实现数值交换,又是为什么呢?
*p1=*p2;
*p2=p;
printf("%d,%d\n",*p1,*p2);
}
搜索更多相关主题的帖子: 指针 
2006-08-13 22:16
触电
Rank: 1
等 级:新手上路
威 望:1
帖 子:228
专家分:0
注 册:2006-7-26
收藏
得分:0 
第一个函数你只是把指向这2个变量的指针交换了下,没有更改原先变量
所存储的内容,当然不会有交换了
2006-08-13 22:23
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

先说第二个,之所以能交换成功,是因为您在函数形参是传址,通过传址把地址指向的内容改变了,从而成功了,
如果您换成rub(x,y);就不能成功,因为函数形参是重新分配的空间,无法对主函数的变量进行调换,而只有通过传址才能成功调换。
同理应用于分析第一个失败的原因,虽然您在函数形参仍是传址,但在函数具体实现时,您却是对地址进行交换,而这个地址的空间在形参时是重新分配的,并不是真正变量x,y的地址,除非您改成这样:
main()
{
void rub(int **p1,int **p2);
int x,y;
int *p1,*p2;
x=1,y=2;
p1=&x,p2=&y;
rub(&p1,&p2);
printf("%d,%d\n",*p1,*p2);
}
void rub(int **p1,int **p2)
{
int *p;
p=*p1;
*p1=*p2;
*p2=p;
printf("%d,%d\n",**p1,**p2);
}

改成这样,应该就行了,
您如果对我上面的解释不明白,不妨就按着这两个程序琢磨,自己体会的东西才算真正掌握。


对不礼貌的女生收钱......
2006-08-13 22:27
ridwsc
Rank: 1
等 级:新手上路
帖 子:168
专家分:0
注 册:2006-8-10
收藏
得分:0 

我错了

[此贴子已经被作者于2006-8-13 22:53:51编辑过]


中国加油,加油,加油~~~~~ 我行~~我可以~~C
2006-08-13 22:28
笔干2006
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2006-7-13
收藏
得分:0 

不对吧 我记得是第一个正确 这涉及到了实参与形参单值传递的问题 我还仔细看了这部分 我回去再好好看看


2006-08-13 22:30
ldliming
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2006-8-12
收藏
得分:0 
第一个函数的再调用rub()之前p1指向x的地址,p2指向y的地址,调用后p1指向y的地址p2指向x的地址,再输出的时候应该能够调换数值阿。可是为什么不能呢?
2006-08-13 22:31
ridwsc
Rank: 1
等 级:新手上路
帖 子:168
专家分:0
注 册:2006-8-10
收藏
得分:0 

我错了

[此贴子已经被作者于2006-8-13 22:54:18编辑过]


中国加油,加油,加油~~~~~ 我行~~我可以~~C
2006-08-13 22:36
触电
Rank: 1
等 级:新手上路
威 望:1
帖 子:228
专家分:0
注 册:2006-7-26
收藏
得分:0 

你第一个方法虽然传递的是指针,但还只是形成了一个地址副本传递罢了

2006-08-13 22:39
ridwsc
Rank: 1
等 级:新手上路
帖 子:168
专家分:0
注 册:2006-8-10
收藏
得分:0 
楼主,交换地址即交换指针的指向 可以交换两个数值的

你要看清楚程序二次输出的先后顺序哦

你函数调用没有返回值,当然不影响main()中的输出.

第一行输出的2 1 是被调函数输出的
第二行1 2是才是main()输出的,

[此贴子已经被作者于2006-8-13 23:09:54编辑过]


中国加油,加油,加油~~~~~ 我行~~我可以~~C
2006-08-13 23:02
皮皮鲁
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2006-7-27
收藏
得分:0 

两个程序都是对的啊。

我用WIN--TC检验了一下,发现它们的输出结果都是2,1。楼主不是说第一个是错的吗,为什么会出现这种情况呢?

[此贴子已经被作者于2006-8-14 11:21:20编辑过]

2006-08-14 11:20
快速回复:关于指针的调用问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018366 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved