关于指针,形参实参,单向值传递的问题

[复制链接]
查看11 | 回复4 | 2010-12-25 02:10:03 | 显示全部楼层 |阅读模式
#include

swap(int *p1,int *p2)

{

int *p;

p=p1;

p1=p2;

p2=p;

}

main()

{

int a,b;

int *pa1,*pa2;

scanf("%d,%d",&a,&b);

pa1=&a;pa2=&b;

swap(pa1,pa2);

printf("\n%d,%d\n",*pa1,*pa2);

printf("\n%d,%d\n",a,b);

getch();

}
swap函数里面明明p1和p2的地址进行了交换,pa1指向了b,pa2指向了a,为什么最后的值没有交换呢,这个单向值传递具体是指什么呢?

回复

使用道具 举报

千问 | 2010-12-25 02:10:03 | 显示全部楼层
C语言中有两种传递方式,一个是值传递,另一个是地址(指针)传递。 值传递就是单向传递。它只给从实参传递给形参,而形参经过改变后不会传递给实参,对函数而言,就是参数经过主调用函数传递给了被调用函数,而我们知道,被调用函数除了用return语句返回一个值外,其余的值就不可以返回了。所以说值传递是单向传递。 地址传递则解决了值传递只能返回一个值的尴尬局面。地址传递通过把传入参数的地址以指针方式传递给形参,进而直接对传入参数的内在单元进行修改,所以,这种传递方式可以彻底改变传入参数,不受被调用函数只能返回一个值的限制。 由上面,所以,当你希望通过调用函数并返回多个数值时就要用地址传递的方式,其余就可以选用值传递了。 下面这道题采
回复

使用道具 举报

千问 | 2010-12-25 02:10:03 | 显示全部楼层
最后值没有交换是由于p1和p2的值确实交换了,但pa1和pa2的值没有交换。也就是说swap()里边的交换成功了,但这和swap()外边没有关系单向值传递实际上是由于栈的存储方式造成的。由于局部变量是存储在栈中的,main()和swap()可以看成2个栈片段,而swap()是栈顶哪个片段。你的程序过程是先在栈底申请了个main()片段,在ma
回复

使用道具 举报

千问 | 2010-12-25 02:10:03 | 显示全部楼层
p=p1;p1=p2; p2=p;这个地方写错了应该写成*p = *p1; *p1 = *p2; *p2 = *p;取值,p1=p2;只是把P2本身的地址给了P1,并不是把指针P2所保存的地址给指针P1你的printf写的就是printf("\n%d,%d\n",*pa1,*pa2);取的是*pa1,*pa2
回复

使用道具 举报

千问 | 2010-12-25 02:10:03 | 显示全部楼层
如果想深入了解指针,并且想学好C语言,建议你看一本特别经典的书籍《C和指针》。如果你能把它看完,你就已经很牛了。 对于本题目来说,函数swap中改成一下代码就OK了: int p;p = *p1; *p1 = *p2; *p2 = p;具体的不太好说。自己领悟一下吧。圣诞节快乐~~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行