标题:对于指针做为形参的处理过程一问?跪求了呀
只看楼主
lqlayy
Rank: 1
等 级:新手上路
帖 子:100
专家分:0
注 册:2007-3-15
 问题点数: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-05-11 12:02
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-05-11 12:20
forever74
Rank: 12Rank: 12Rank: 12
来 自:CC
等 级:贵宾
威 望:49
帖 子:1636
专家分:3940
注 册:2007-12-27
得分:0 
刚说完明白了,还以为你真的明白了呢。

标准C语言的函数调用是单向传值的,任何对形参的改变都不会影响实参的值。
要想通过函数调用改变任何变量的值,就必须用该变量的地址作为实参,用合适的指针作为形参,并在函数中改变指针的目标。
2008-05-11 12:34
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
请按任意键继续. . .
这就可以证明了当指针做参数时,形参相当于另外定义了指针,只是与实参的指向相同,所以通过直接交换形参指针的方法是不能完成对实参的改变的,忙了我一天呀

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

学习编程的秘诀是:编程,编程,再编程;
2008-05-11 17:20
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
得分:0 
C语言没有引用传递,完毕……

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

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

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

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


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

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


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



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

有人说JAVA没指针 形式而已

2008-05-12 15:49



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-213680-1-1.html




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

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