请问,为什么下面程序运行后x与y的值没有交换? 感激不尽...

运行结果:请输入两个数:12x=1y=2Pressanykeytocontinue程序:#include<stdio.h>voidswap(inta,intb){intt... 运行结果:
请输入两个数:
1 2
x=1
y=2
Press any key to continue

程序:
#include<stdio.h>
void swap(int a,int b)
{
int tmp;
tmp=a;
a=b;
b=tmp;
}
void main()
{
int x,y;
printf("请输入两个数:\n");
scanf("%d",&x);
scanf("%d",&y);
swap(x,y);
printf("x=%d\n",x);
printf("y=%d\n",y);
}
展开
 我来答
丶光明使者丶丶
2012-10-25 · TA获得超过119个赞
知道答主
回答量:19
采纳率:0%
帮助的人:18万
展开全部
我才你们肯定刚学到C语言的函数部分吧 这是函数部分的知识吧,首先函数的大致组成是 返回类型+函数名+(参数列表) 譬如你的佳交换函数 参数 类型往大的分有两种,一种是值传递,一种是传地址,值传递的工作原理是你把主函数中的x ,y传进去后,在你的交换函数中a和b分别获得x,y的值,但是不管a和b的值怎么变化 都不会影响你主函数中的x,y的值,因为值传递采用的是为你的a,b另外开辟空间,是单向的(意识就是x,y去影响了a,b 反过来不会) 。还有一种是采用传递地址的方式,这就是可以实现你交换想法的了改动如下:
程序:
#include<stdio.h>
void swap(int *a,int *b) //指针你们学了吧,穿进去一个地址,交换函数里面的a就是x,b就是y, 他们公用地址了所以不管谁改变都会影响另一个改变的
{
int tmp;
tmp= *a; //指针类型变量前面加* 号是为了取出指针所指向 的空间的内容
*a= *b;
*b=tmp;
}
void main()
{
int x,y;
printf("请输入两个数:\n");
scanf("%d",&x);
scanf("%d",&y);
swap( &x, &y); //调用的时候的参数传递也要改一下,改成传地址,所以在变量前面加上了取地址符号 & 这样子在你的交换函数内部做的交换才会影响到你的主函数中的变量值
printf("x=%d\n",x);
printf("y=%d\n",y);
}

这些问题是我们去年的了 呵呵 好怀念哈
追问
请问,为什么,定义的函数swap(int *a,int *b) 中参数为两个指针,但是后面赋值时,
却赋的是两个地址swap( &x, &y);。(类型不不匹配啊!)?
感谢...
追答
指针类型的变量就是要接受一个地址的啊,所依据把x,y的地址传进去哈
#include
void swap(int *a,int *b)
{
int tmp;
tmp=*a;
*a=*b;
*b=tmp;
}
void main()
{
int x,y;
printf("请输入两个数:\n");
scanf("%d",&x);
scanf("%d",&y);
swap(&x,&y);
printf("x=%d\n",x);
printf("y=%d\n",y);
}
你把这段代码放进去 应该可以执行的
terranlong
2012-10-25 · TA获得超过7294个赞
知道大有可为答主
回答量:2660
采纳率:0%
帮助的人:4024万
展开全部
#include<stdio.h>
void swap(int* a,int* b) // 必须以地址传递,不然交换的只是a和b,而不是x和y
{
int tmp;
tmp=*a;
*a=*b;
*b=tmp;
}
void main()
{
int x,y;
printf("请输入两个数:\n");
scanf("%d",&x);
scanf("%d",&y);
swap(&x,&y);
printf("x=%d\n",x);
printf("y=%d\n",y);
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友3038d88
2012-10-25 · TA获得超过1097个赞
知道小有建树答主
回答量:1670
采纳率:0%
帮助的人:1176万
展开全部
这里的知识点是 参数的三种传递方式
值传递,址传递,和引用传递.
值传递: 只是把值复制了一份 给函数参数的 a 和 b . 不管你怎么操作 a和b , x ,y 根本没有变化.
是4个 独立的内存空间的存在.

地址传递: 就不一样了. 把x,y的地址 传递过去. 操作指针. 达到目的, 实际上就是修改了 x,y

引种传递: 跟地址传递本质是上一样的. 只是你不需要操作指针. 只需要操作 a和b 就是操作x,y了. 这是一种语法.你这么理解就好.

引种传递的示例:
void swap(int & a, int & b); 这里"&" 符号是 引用的意思.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xoaxa
2012-10-25 · TA获得超过8613个赞
知道大有可为答主
回答量:6415
采纳率:72%
帮助的人:3521万
展开全部
这是老问题了。
可以这样定义函数
void swap(int *a,int *b) {
int tmp = *a;
*a = *b;
*b = t mp;
}

调用时,应该这样
swap(&a, &b);
追问
请问,为什么,定义的函数swap(int *a,int *b) 中参数为两个指针,但是后面赋值时,
却赋的是两个地址swap( &x, &y);。(类型不不匹配啊!)?
感谢...
追答
在主调函数中,a和b是变量,而形参需要指针,所以在变量前加&,表示要将变量地址进行传递,只有这样才可以与形参的类型相匹配。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ddc_2012
2012-10-25 · 超过13用户采纳过TA的回答
知道答主
回答量:80
采纳率:100%
帮助的人:40.3万
展开全部
swap函数参数改为引用:

void swap(int &a,int &b);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2012-10-25
展开全部
你这是值传递。

参数有三种传递方式: 值传递,址传递,和引用传递.

值传递: 只是把值复制了一份 给函数参数的 a 和 b . 不管你怎么操作 a和b , x ,y 根本没有变化.
是4个 独立的内存空间的存在.

地址传递: 就不一样了. 把x,y的地址 传递过去. 操作指针. 达到目的, 实际上就是修改了 x,y

引种传递: 跟地址传递本质是上一样的. 只是你不需要操作指针. 只需要操作 a和b 就是操作x,y了. 这是一种语法.你这么理解就好.

引种传递的示例:
void swap(int & a, int & b); 这里"&" 符号是 引用的意思.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式