精华帖 三个数比较大小问题
三个数比较大小,源码1和源码2一个成功一个失败源码1 运行正常,但无法交换,失败。
#include<stdio.h>
void swap(int m,int n); //交换
void main()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(a<b)
swap(a,b); //如果a<b,交换。
if(a<c)
swap(a,c); //同上。
if(b<c)
swap(b,c); //同上
printf("%d>%d>%d\n",a,b,c);
}
void swap(int m,int n) // 交换
{
int t;
t=m;
m=n;
n=t;
}
源码2 成功。
#include<stdio.h>
void swap(int *m,int *n); //交换,与1相比变成指针型
void main()
{
int a,b,c;
int *p1,*p2,*p3; //定义指针
scanf("%d%d%d",&a,&b,&c);
p1=&a;
p2=&b;
p3=&c;
if(a<b)
swap(p1,p2); //如果a<b,交换
if(a<c)
swap(p1,p3); // 同上
if(b<c)
swap(p2,p3); //同上
printf("%d>%d>%d\n",a,b,c);
}
void swap(int *m,int *n)
{
int t; //以第一个a<b为例
t=*m; //t=a;
*m=*n; //a=b;
*n=t; //b=t;
}
源码1是 传值引用 调用函数时,会copy产生他们的副本 并将副本传给函数,函数改变的是副本的值,调用结束返回时,副本被销毁
源码2是 传指针引用调用函数时,会将实参的地址传过去, 故函数可以直接改变该地址的值,故可以真正改变 再接再厉 楼上已经回答了,源码1是传值,源码2是传址。
具体来说源码1的参数m和n在调用时实际上做了下面的事情
if(a<b){调用函数(m=a,n=b)},在函数里面是已经交换了的,可是在main()中a还是a,b还是b,所以你看不到。
而在源码2中,参数m和n是一个指针,是直接对b,b进行访问的,所以成功了,这样说你能明白么。
记得采纳哦,打字很累的呢! 哦,补充一下,其实你可以不要定义p1,p2,p3的,可以在调用函数的时候用&操作符把变量的地址传过去就可以了。 swap ( int *a, int *b) 要想swap()函数中交换两个变量的值,然后在main函数中使用,那么调用swap()时要使用输入型参数.
输入型参数说白了就是用指针变量作为函数的参数,比如说:
int a, b; 要想交换a, b的值,那么应该用swap(int *x, int *y)这种形式调用.
int *a, *b; 要想交换a, b的值,那么应该用swap(int **x, int **y)这种形式调用.
至于你说的第一种,情况如下:
就是这样而已咯{:10_254:}
小甲鱼不都说了吗,如果你要将函数中的形参赋值为主函数的实参,只能通过指针传递,当然楼主也可以将a,b,c定义为全局变量,再用函数进行交换 7楼已经说的很明白了,如果不明白,那就是你指针入门都还没弄清楚,和函数的传参没有搞清楚。还是把视频教程再多
几遍吧 11111111111111
页:
[1]