| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
学习型 ASP/PHP/ASP.NET 主机 35元/年全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付
赛孚耐:软件保护加密专家身份认证令牌USB KEY虚拟主机 域名注册 主机托管 
共有 1220 人关注过本帖
标题:对于指针做为形参的处理过程一问?跪求了呀
收藏  推荐  打印 
lqlayy
Rank: 2
等级:注册会员
帖子:100
积分:1100
注册:2007-3-15
结帖率:0/0
  问题点数:0  回复次数:11   
对于指针做为形参的处理过程一问?跪求了呀

程序一:
#include <stdio.h>
#include <stdlib.h>
void swap(int *p[])
{
    int *temp;
    temp=p[0];//指针temp指向p[0]的指向也就是0240FF5C
    p[0]=p[1];//p[0]放弃原来的0240FF5C转而指向0240FF58
    p[1]=temp;//p[1]放弃原来的0240FF58转而指向0240FF5C,这个过程完了之后虽然形参没有了,但是返回实参后对指针首址的指向改变仍然存在,所以就交换了。
}
main()
{
int a=10,b=20,*p[2]={&a,&b};
printf("%p,%p\n",p[0],p[1]);
swap(p);
printf("%p,%p\n",p[0],p[1]);
}的执行结果为:
0240FF5C,0240FF58
0240FF58,0240FF5C
请按任意键继续. . .
程序二:
#include <stdio.h>
#include <stdlib.h>
void swap(int *p1,int *p2)
{
    int *temp;
    temp=p1;
    p1=p2;
    p2=temp;
}
main()
{
int a=10,b=20,*p1=&a,*p2=&b;
printf("%p,%p\n",p1,p2);
swap(p1,p2);
printf("%p,%p\n",p1,p2);
}执行结果为:
0240FF5C,0240FF58
0240FF5C,0240FF58
请按任意键继续. . .
本来程序一我明白了,不过一看二就糊涂了,我的理解如下:
对于程序一:如上注释;但是对于程序二不也和程序一一样吗,为什么一返回主函数指针的指向就没有交换?
实在是不明白程序二是为什么呀,大家快帮下忙呀,跪求了
搜索更多相关主题的帖子: 形参  指针  int  temp  
2008-5-11 12:02
c_acceleration
Rank: 2
等级:注册会员
帖子:101
积分:1110
注册:2008-4-28
  得分:0 

#include <stdio.h>
#include <stdlib.h>
void swap(int **p1,int **p2)
{
    int *temp;
    temp=*p1;
    *p1=*p2;
    *p2=temp;
}
int main()
{
    int a=10,b=20,*p1=&a,*p2=&b;
    printf("%p,%p\n",p1,p2);
    swap(&p1,&p2);
    printf("%p,%p\n",p1,p2);
    return    0;
}

天道酬勤
2008-5-11 12:20
forever74
Rank: 4
等级:高级会员
威望:6
帖子:710
积分:7900
注册:2007-12-27
  得分:0 

刚说完明白了,还以为你真的明白了呢。

标准C语言的函数调用是单向传值的,任何对形参的改变都不会影响实参的值。
要想通过函数调用改变任何变量的值,就必须用该变量的地址作为实参,用合适的指针作为形参,并在函数中改变指针的目标。
2008-5-11 12:34
lqlayy
Rank: 2
等级:注册会员
帖子:100
积分:1100
注册:2007-3-15
  得分:0 

再次谢谢楼上朋友,哈哈,这回我终于明白了,通过如下过程可以证明:(指针数组、数组、指针,变量等类似)
#include <stdio.h>
#include <stdlib.h>
void swap(int *p1,int *p2)
{
    printf("%p,%p\n",&p1,&p2);
}
main()
{
int a=10,b=20,*p1=&a,*p2=&b;
printf("%p,%p\n",&p1,&p2);
swap(p1,p2);
}编译结果为:
0240FF54,0240FF50
0240FF38,0240FF3C
请按任意键继续. . .
这就可以证明了当指针做参数时,形参相当于另外定义了指针,只是与实参的指向相同,所以通过直接交换形参指针的方法是不能完成对实参的改变的,忙了我一天呀

[ 本帖最后由 lqlayy 于 2008-5-11 17:21 编辑 ]

学习编程的秘诀是:编程,编程,再编程;
2008-5-11 17:20
StarWing83
Rank: 12Rank: 12Rank: 12
来自:湖北工业大学
等级:版主
威望:16
帖子:3540
积分:36900
注册:2007-11-16
  得分:0 

C语言没有引用传递,完毕……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-5-11 21:35
布拉莫斯
Rank: 3Rank: 3
来自:中国太平洋舰队
等级:中级会员
帖子:168
积分:1780
注册:2007-3-31
  得分:0 
十三秒的奇迹!

指针是用来传址的,能用来传值吗?

真理往往掌握在少数人手中,可现实却是少数服从多数!
2008-5-11 21:49
dinhowang
Rank: 1
来自:黄山
等级:新手上路
帖子:7
积分:170
注册:2008-3-28
  得分:0 

swap(p1,p2)??!!
不对
2008-5-11 21:52
feelerly
Rank: 1
来自:GZ
等级:新手上路
帖子:17
积分:270
注册:2008-5-1
  得分:0 

以下是引用 forever74 在 2008-5-11 12:34 的发言:

刚说完明白了,还以为你真的明白了呢。

标准C语言的函数调用是单向传值的,任何对形参的改变都不会影响实参的值。
要想通过函数调用改变任何变量的值,就必须用该变量的地址作为实参,用合适的指针作为形参,并在函数中改变指 ...
很是赞同,因为普通形参在函数内部可以改变其值,但无法改变其实际参数的值,而指针传递的是一个地址,相当于C++中的引用了。另外,在传递字符数组时,也常使用指针传递,而不是使用字符数组。
2008-5-12 08:23
StarWing83
Rank: 12Rank: 12Rank: 12
来自:湖北工业大学
等级:版主
威望:16
帖子:3540
积分:36900
注册:2007-11-16
  得分:0 

LS:指针不是引用

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-5-12 15:42
夜火
Rank: 2
等级:注册会员
帖子:149
积分:1590
注册:2007-5-30
  得分:0 

C语言 可以用 值传递 和传引用  


地址是什么  地址也是 一个数值对吧  
传引用 你 吧 地址的 数值都传过去了  修改地址数值所 代表的值  不是 很简单么



可以说  所以编程语言 的 传递  都可以用 C语言 进行

有人说JAVA没指针 形式而已

2008-5-12 15:49
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.085758 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved