| 网站首页 | 业界新闻 | 技术文章 | 下载频道 | 程序源码 | 个人空间 | 代码贴 | 编程论坛
→ 去下载频道上传资源和大附件(最大100M)
共有 2613 人关注过本帖
标题:对于指针做为形参的处理过程一问?跪求了呀
[收藏]  订阅  推荐  打印
lqlayy
Rank: 1
等 级:新手上路
帖 子:100
专家分:0
注 册: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:58
c_acceleration
Rank: 1
等 级:新手上路
帖 子:101
专家分:0
注 册: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:32
forever74
Rank: 9Rank: 9Rank: 9
来 自:CC
等 级:贵宾
威 望:11
帖 子:998
专家分:1184
注 册:2007-12-27
  得分:0 
刚说完明白了,还以为你真的明白了呢。

标准C语言的函数调用是单向传值的,任何对形参的改变都不会影响实参的值。
要想通过函数调用改变任何变量的值,就必须用该变量的地址作为实参,用合适的指针作为形参,并在函数中改变指针的目标。
2008-5-11 12:34:50
lqlayy
Rank: 1
等 级:新手上路
帖 子:100
专家分:0
注 册: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:58
StarWing83
Rank: 8Rank: 8
来 自:湖北工业大学
等 级:贵宾
威 望:19
帖 子:3943
专家分:748
注 册:2007-11-16
  得分:0 
C语言没有引用传递,完毕……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-5-11 21:35:17
布拉莫斯
Rank: 1
来 自:中国太平洋舰队
等 级:新手上路
帖 子:168
专家分:0
注 册:2007-3-31
  得分:0 
十三秒的奇迹!
指针是用来传址的,能用来传值吗?

真理往往掌握在少数人手中,可现实却是少数服从多数!
2008-5-11 21:49:05
dinhowang
Rank: 1
来 自:黄山
等 级:新手上路
帖 子:7
专家分:0
注 册:2008-3-28
  得分:0 
swap(p1,p2)??!!
不对
2008-5-11 21:52:11
feelerly
Rank: 1
来 自:GZ
等 级:新手上路
帖 子:17
专家分:0
注 册:2008-5-1
  得分:0 
以下是引用 forever74 在 2008-5-11 12:34 的发言:

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

标准C语言的函数调用是单向传值的,任何对形参的改变都不会影响实参的值。
要想通过函数调用改变任何变量的值,就必须用该变量的地址作为实参,用合适的指针作为形参,并在函数中改变指 ...


很是赞同,因为普通形参在函数内部可以改变其值,但无法改变其实际参数的值,而指针传递的是一个地址,相当于C++中的引用了。另外,在传递字符数组时,也常使用指针传递,而不是使用字符数组。
2008-5-12 08:23:41
StarWing83
Rank: 8Rank: 8
来 自:湖北工业大学
等 级:贵宾
威 望:19
帖 子:3943
专家分:748
注 册:2007-11-16
  得分:0 
LS:指针不是引用

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-5-12 15:42:29
夜火
Rank: 1
等 级:新手上路
帖 子:149
专家分:0
注 册:2007-5-30
  得分:0 
C语言 可以用 值传递 和传引用  


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



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

有人说JAVA没指针 形式而已

2008-5-12 15:49:23







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

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