Chinaunix

标题: 一个小问题,有点不解 [打印本页]

作者: 凝神    时间: 2004-12-05 17:10
标题: 一个小问题,有点不解
m a i n ( )
{
     void chang();
     int *p1,*p2,a,b,*t;
     s c a n f ( " % d , % d " , & a , & b ) ;
     p 1 = & a ;
     p 2 = & b ;
     c h a n g ( p 1 , p 2 ) ;
     p r i n t f ( " % d , % d \ n " , * p 1 , * p 2 ) ;
}

void chang(int *pt1,int *pt2)
{
    int *t;
    if (*pt1<*pt2)
    {
       t=pt1; pt1=pt2; p t 2 = t ;
    }
       r e t u r n ;
}

在函数chang中已经把指针指向交换了,为什么在打印时还是没能交换输入的两个数呢?难道这种交换仅在chang函数内有效?如果在chang函数中把这两个指针return回去,会不会达到交换的目的呢?
问题有点弱,请各位老大别笑我,呵呵,谢谢。
作者: kj501    时间: 2004-12-05 17:19
标题: 一个小问题,有点不解
交换指针并不等于交换了指针指向的数据。呵呵,楼主需要好好理解指针的概念。
作者: 凝神    时间: 2004-12-05 17:28
标题: 一个小问题,有点不解
p1指向a,P2指向b,我把P1、P2的指向交换了,那就成了P1指向b,P2指向a,那打印*P1的时候,就应该打印出b来呀。
作者: assiss    时间: 2004-12-05 17:35
标题: 一个小问题,有点不解
我在这个论坛上第三次强调,
如果想交换两个对象的值,请用该对象的指针。
如果想交换两个指针的值,请用指针的指针。
作者: lenovo    时间: 2004-12-05 17:40
标题: 一个小问题,有点不解
你输出p1,p2, pt1,pt2的地址,
看看它们是不是一样的。
作者: 凝神    时间: 2004-12-05 17:48
标题: 一个小问题,有点不解
是这样吗?

    int **t;
      if( *p1<*p2 )
      {
            t=&p1;&p1=&p2;&p2=t;
       }
作者: assiss    时间: 2004-12-05 17:59
标题: 一个小问题,有点不解
原帖由 "凝神" 发表:
是这样吗?

    int **t;
      if( *p1<*p2 )
      {
            t=&p1;&p1=&p2;&p2=t;
       }

再向前想一想。想想flw的话。
作者: 凝神    时间: 2004-12-05 18:35
标题: 一个小问题,有点不解
m a i n ( )
{
void chang();
int *p1,*p2,a,b,*t;
s c a n f ( " % d , % d " , & a , & b ) ;
p 1 = & a ;
p 2 = & b ;
c h a n g ( p 1 , p 2 ) ;
p r i n t f ( " % d , % d \ n " , * p 1 , * p 2 ) ;
p r i n t f ( " % d , % d \ n " ,  p 1 , p 2 ) ;
}

void chang(int *pt1,int *pt2)
{
int *t;
if (*pt1<*pt2)
{
t=pt1; pt1=pt2; p t 2 = t ;
}
p r i n t f ( " % d , % d \ n " , * p t1 , * p t2 ) ;
r e t u r n ;
}


我试了一下,输入:1,2,输出:2 ,1 ;1 ,2;2147481620,2147281616。

输出的第一个结果不是已经把输入交换了吗?但第二个输出没明白怎么回事。
小弟有点笨,麻烦点解一下。
作者: lenovo    时间: 2004-12-05 18:51
标题: 一个小问题,有点不解
让你把它们的地址都打印出来,你怎么不听你呢?
给你一段代码,你看看和你的区别在哪里。

  1. #include <stdio.h>;
  2. int
  3. main ( )
  4. {
  5.         void chang(int **, int **);
  6.         int *p1,*p2,a,b,*t;
  7.         scanf("%d,%d" , &a, &b) ;
  8.         p1 = &a ;
  9.         p2 = &b ;
  10.         chang( &p1 , &p2 ) ;
  11.         printf( "%d, %d \n" , *p1 , *p2 ) ;
  12.         return 0;
  13. }

  14. void chang(int ** pt1,int **pt2)
  15. {
  16.         int * t;
  17.         if (**pt1 < **pt2)
  18.         {
  19.                 t = *pt1;
  20.                 *pt1 = *pt2;
  21.                 *pt2 = t ;
  22.         }
  23.         return ;
  24. }
复制代码

还有以后贴代码要用code标签。
看你的代码有多恶劣。
作者: 凝神    时间: 2004-12-05 18:59
标题: 一个小问题,有点不解
谢谢。。。
我刚才不知道怎么使用CODE标签,我也觉得那样贴着很难看。不好意思不好意思。。。下次一定注意。呵呵。[/code]
作者: zlrll    时间: 2004-12-05 19:51
标题: 一个小问题,有点不解
chang()里面的p1和p2都是局部变量,改变他们并没有改变主函数中p1和p2的指向
作者: 凝神    时间: 2004-12-05 20:15
标题: 一个小问题,有点不解
不知道局部变量的问题吧。lenovo的代码是正确的,用指针的指针交换了&p1、&p2,实现了目的。a,b存放的地址是没变的。
作者: ballball2    时间: 2004-12-05 21:04
标题: 一个小问题,有点不解
原帖由 "assiss" 发表:
我在这个论坛上第三次强调,
如果想交换两个对象的值,请用该对象的指针。
如果想交换两个指针的值,请用指针的指针。

不是已经说的很清楚吗?
你是把*pt1=p1,*pt2=p2,如果用pt2,pt1不能交换地址
你再仔细想想就会明白了!
作者: x911    时间: 2004-12-06 01:13
标题: 一个小问题,有点不解
不错!
作者: ballball2    时间: 2004-12-06 08:43
标题: 一个小问题,有点不解
我开始理解错误了,我想应该是这样:
你要交换两个指针的值,首先要找到指针的地址,就是*pt1=p1,然后**pt1=*p1=a.
你用笔画一下就知道了
作者: kj501    时间: 2004-12-06 11:27
标题: 一个小问题,有点不解
[quote]原帖由 "凝神"]p1指向a,P2指向b,我把P1、P2的指向交换了,那就成了P1指向b,P2指向a,那打印*P1的时候,就应该打印出b来呀。[/quote 发表:

当函数返回时,交换还有效吗?你对指针作为函数参数时是如何传递的,这个问题实际上你没有理解。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2