C语言函数调用、指针问题(重发)

#include<stdio.h>voidswap(int*x1,int*x2){intt;t=*x1;*x1=*x2;*x2=*x1;}voidorder(int*a,... #include<stdio.h>
void swap(int*x1,int*x2)
{
int t;
t=*x1; *x1=*x2; *x2=*x1;
}
void order(int*a,int*b)
{if(*a>*b) swap(a,b);}
main()
{
int x,y;
scanf("%d%d",&x,&y);
order(&x,&y);
printf("x=%dy=%d",x,y);
}
首先从main函数里面调用order函数,再由order函数里面调用swap,为什么在order函数里面的swap(a,b)的a、b不加*?加和不加有什么区别?请高手指点一下我。刚才的题目有点问题。。。。。。
展开
 我来答
looney81
2012-02-02 · TA获得超过621个赞
知道小有建树答主
回答量:945
采纳率:73%
帮助的人:543万
展开全部
if(*a>*b) swap(a,b);} 语句前面加*,是对a和b两个指针变量的值得大小做比较(比较的是变量值,而不是变量地址),如果a>b为真,则调用swap函数,调用时的把实参a和b(的值)传给形参x1和y1。

而在void swap(int*x1,int*x2)中,加了*是表示把x1和x2定义为指针变量,在下面的语句中,起到把X1和X2的值(而不是地址)互换的作用,所以t=*x1; *x1=*x2; *x2=*x1语句中加*.

一般说,加*是表示该变量的值,不加*是表示该变量指向的地址。实参表中是不能加*的。
楼下说的地址传递给swap是错误的,本例函数调用完成的是值的传递,而不是地址的传递。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
531243354
2012-02-02 · TA获得超过491个赞
知道小有建树答主
回答量:392
采纳率:0%
帮助的人:413万
展开全部
请问
t=*x1; *x1=*x2; *x2=*x1;
是否有差错?还是程序本意?
个人觉得将 *x2 = *x1; 改成 *x2 = t; 更适合一般的思想。

因为 order() 和 swap() 中形参被声明均为指向int的指针,所以当在order()中用a和b作实参去调用swap()的时候,a<->x1 , b,<->x2,大家都是指针类型,大家都是一个地址,简单地说就是传地址,而不是传值,这就ok啦。
——————————————————————————————
可能有一点是要特别提出来的,就是:
声明指针: int *p;
用指针时: p 就是指针啦,而 *p就是p中存的地址指向内存空间的值啦。
另外,请着重理解 *x1 = *x2; 的意思。
——————————————————————————————
本人C新手,以上若有不到之处请指出。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
penghaoren9112
2012-02-02
知道答主
回答量:27
采纳率:0%
帮助的人:9.5万
展开全部
void order(int*a,int*b)
{
if(*a>*b)
swap(a,b);
}
在主函数中通过scanf输入x,y值后,调用order(&x,&y);函数,将x,y的地址传递出去,这样a就指向x,b就指向了y,在if的条件判断中*a就是x的值,*b就是y的值,a,b本身是指针,所以swap中a,b,不要加*,否者传递的是x,y的值,而不是x,y的地址。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2012-02-01
展开全部
因为在order函数里面,a,b已经是地址了,所以直接传递给swap就行了
order和swap的参数是int*,所以这是传址的方式
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zwf82144c
2012-02-02
知道答主
回答量:20
采纳率:0%
帮助的人:10.9万
展开全部
应为A和B本身就是一个指针它的内存里面存储的是目标地址,而且你的SWAP函数里面声明时的2个形参是指针啊,你得起码保证参数类型相同啊,如果你加大是*的话,拿你传递就不是指针了而是指针对指向的INT 类的数据了当然不能加了
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式