标题:问个小程序的问题
只看楼主
hy1107648
Rank: 2
等 级:论坛游民
帖 子:80
专家分:40
注 册:2010-2-8
结帖率:37.5%
已结贴  问题点数:20 回复次数:5 
问个小程序的问题
我做了一道二级题,题目让选择以下程序的输出结果
#include<stdio.h>
void fun(int *a,int *b)
{
    int *c;
    c=a;
    a=b;
    b=c;
}
int main()
{
    int x=3,y=5,*p=&x,*q=&y;
    fun(p,q);
    printf("%d,%d\n",*p,*q);
    fun(&x,&y);
    printf("%d,%d",*p,*q);
}
我认为fun函数会把p和q的值相互对调,所以p会指向y,q会指向x,同理,由于&x和&y的值互相对调,会使p会指向x,q会指向y,我认为结果是5,3  
                                                                                                                          3,5
但实际结果是3,5  ,请大家帮我分析一下这个程序,谢谢啦~
            3,5
                                                                                                                          
搜索更多相关主题的帖子: void 二级 include 
2010-08-23 18:03
郁闷→成仙
Rank: 2
等 级:论坛游民
帖 子:12
专家分:27
注 册:2010-1-10
得分:5 
void fun(int *a,int *b)
{
    int c;
    c=*a;
    *a=*b;
    *b=c;
}
这样试试,应该是你要的结果。。
2010-08-23 18:16
hy1107648
Rank: 2
等 级:论坛游民
帖 子:80
专家分:40
注 册:2010-2-8
得分:0 
能解释一下我给出的程序的结果为什么是3,5 吗??
                                    3,5
2010-08-23 18:22
erikyo
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:270
专家分:1154
注 册:2010-6-10
得分:5 
其实很简单,因为你编写的函数但参数是两个int类型的指针,你传入的是指针变量也没错。
但是你采取的是交换指针的值而不是指针指向对象的值,这就有问题了。
函数在返回主函数之后不会把交换的值带回主函数。
楼主可能会很困惑,明明是传地址啊,怎么不会返回狡猾后的结果呢。
这里要明白传地址的本质,所谓传独自,传的是你要操作的对象的地址呢,
你要操作的是指针,那就得把指针的地址(二级指针)传进入才是。
帮你做了一下修改:
#include <stdio.h>

void fun(int **a,int **b)
{
    int *c;
    c=*a;
    *a=*b;
    *b=c;
}
int main()
{
    int x=3,y=5,*p=&x,*q=&y;
    fun(p,q);
    printf("%d,%d\n",*p,*q);
    fun(&x,&y);
    printf("%d,%d\n",*p,*q);
}
当然2楼的做法也是对的,只是你硬要用操作指针,我的这种方法就满足了!
2010-08-23 18:32
真我
Rank: 4
等 级:业余侠客
威 望:1
帖 子:146
专家分:210
注 册:2010-7-14
得分:5 
传址与传值是个容易混淆的问题
2010-08-24 13:24
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
得分:5 
以下是引用hy1107648在2010-8-23 18:03:43的发言:

我做了一道二级题,题目让选择以下程序的输出结果
#include
void fun(int *a,int *b)
{
    int *c;
    c=a;     
    a=b;
    b=c;
}
int main()
{
    int x=3,y=5,*p=&x,*q=&y;
    fun(p,q);
    printf("%d,%d\n",*p,*q);
    fun(&x,&y);
    printf("%d,%d",*p,*q);
}
我认为fun函数会把p和q的值相互对调,所以p会指向y,q会指向x,同理,由于&x和&y的值互相对调,会使p会指向x,q会指向y,我认为结果是5,3  
                                                                                                                          3,5
但实际结果是3,5  ,请大家帮我分析一下这个程序,谢谢啦~
            3,5
                                                                                                                          
结果没有问题!函数fun 对x,y两个变量没有任何影响
因为实参&x,&y向 形参int *a,int *b 传递的是x、y变量的地址,而函数中的语句    c=a;   a=b;  b=c;
仅仅是将a b 里面分别存储的 x y的地址 变成了 a b 分别存放 y x 的地址,然后不会对x,y两个变量本身产生任何影响
所以 主函数main()中的输出 结果 依然是3,5
题目只是分析程序,并没有要求改,所以我们要把程序分析好就好!

如果想要间接交换x,y两个变量的值,2楼的修改是正确的!

[ 本帖最后由 jack10141 于 2010-8-25 19:09 编辑 ]

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-08-25 19:07



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




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

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