熊小丹小熊 发表于 2014-4-16 16:41:25

一个关于指针的问题 谢谢大家

一个关于指针的问题 新手 请大家帮忙 谢谢
用形参为指针变量的函数实现输入的两个数按照先小后大的顺序输出

如果源代码如下就能实现
#include<stdio.h>

void swap(int *a, int *b);                //用于交换两个数的顺序,形参为指针变量
void main()
{
        int a, b;
        int *p, *q;                  //定义两个指针

        scanf("%d %d",&a,&b);

        p=&a;
        q=&b;                         //p,q分别指向a,b的地址

        if(a>b)
        swap(p,q);

        printf("%d %d\n",*p, *q);

}

void swap(int *a, int *b)
{
                int t;                           //定义一个整型变量
            t=*a;                               //*a为main函数中的*p
          *a=*b;                           //*b为main函数中的*q
          *b=t;
       
}


但是如果把以上的源代码中 swap函数中定义的整型变量改为指针变量 然后交换指针就不行 源代码如下:
#include<stdio.h>

void swap(int *a, int *b);
void main()
{
        int a, b;
        int *p, *q;

        scanf("%d %d",&a,&b);

        p=&a;
        q=&b;

        if(a>b)
        swap(p,q);

        printf("%d %d\n",*p, *q);

}

void swap(int *a, int *b)
{
                int *t;               //定义一个指针变量
              t=a;
          a=b;
          b=t;
       
}


我DEBUG 一步一步看 在swap函数里面 指针a b的地址的确交换了 但是回到main函数里面 p q的地址还是没变

kindling 发表于 2014-4-16 18:22:03

地址改了但是值没改,把swap里面的改成*t=*a;*a=*b;*b=*t;就好了

青玄 发表于 2014-4-16 20:47:05





如上图所示:swap()函数传递的只是这两个参数的地址,t=a传递的只是a的地址;而 t=*a则是将a的地址的内容传递给t,其中*a就是a的地址的内容,要知道函数的参数是int *a,int *b也就是a地址的内容与b地址的内容,也就是互换的时候最终要将它们解引用,不然的话,虽然地址是互换了,但在函数返回的时候,还是没变!因为在这个函数中是通过解引用来互换参数的,所以这样的话,函数在返回时,才算是真正的互换了,最后打印的时候,也是将指针变量的内容打印出来,注意:前面带星号的意思就是说这个地址所指向的内容!

情不空 发表于 2014-4-17 09:10:11

我也遇到过,这样的问题,
   首先你第一个传递时把值传递了,然后输出是输出值。
   第二个,你只是交换了地址,而输出的值没有变,你可以看看地址确实交换了,你可以输出
   printf("%x %x\n,p,q");试试。

熊小丹小熊 发表于 2014-4-21 11:04:06

青玄 发表于 2014-4-16 20:47 static/image/common/back.gif
如上图所示:swap()函数传递的只是这两个参数的地址,t=a传递的只是a的地址;而 t=*a则是将a的地址 ...

谢谢亲 我知道这两种写法的区别 指针和取值的区别 也单步调试了 但是我就是想知道为什么第二种写法SWAP()函数里面 a b的地址交换了 (我想的是 a b地址交换的 虽然值是没有换 但是这样的话 交换地址后 a地址里面应该就是之前b的址了 那么到main()函数里面 p q地址交换了 那么*p就应该是以前*q) 但是虽然swap()里面ab地址交换了 但是main()函数里面 p q(作为swap()函数的实参)的地址却没有交换 还是只有通过交换 *a *b , 新手问题很多 不好意思 麻烦大家了

熊小丹小熊 发表于 2014-4-21 11:04:43

kindling 发表于 2014-4-16 18:22 static/image/common/back.gif
地址改了但是值没改,把swap里面的改成*t=*a;*a=*b;*b=*t;就好了

谢谢亲 我知道这两种写法的区别 指针和取值的区别 也单步调试了 但是我就是想知道为什么第二种写法SWAP()函数里面 a b的地址交换了 (我想的是 a b地址交换的 虽然值是没有换 但是这样的话 交换地址后 a地址里面应该就是之前b的址了 那么到main()函数里面 p q地址交换了 那么*p就应该是以前*q) 但是虽然swap()里面ab地址交换了 但是main()函数里面 p q(作为swap()函数的实参)的地址却没有交换 还是只有通过交换 *a *b , 新手问题很多 不好意思 麻烦大家了

熊小丹小熊 发表于 2014-4-21 11:05:16

情不空 发表于 2014-4-17 09:10 static/image/common/back.gif
我也遇到过,这样的问题,
   首先你第一个传递时把值传递了,然后输出是输出值。
   第二个,你只是交换 ...

谢谢亲 我也单步调试了 但是我就是想知道为什么第二种写法SWAP()函数里面 a b的地址交换了 (我想的是 a b地址交换的 虽然值是没有换 但是这样的话 交换地址后 a地址里面应该就是之前b的址了 那么到main()函数里面 p q地址交换了 那么*p就应该是以前*q) 但是虽然swap()里面ab地址交换了 但是main()函数里面 p q(作为swap()函数的实参)的地址却没有交换 还是只有通过交换 *a *b , 新手问题很多 不好意思 麻烦大家了

聆听丨灬六月 发表于 2014-5-15 10:54:20

这种问题要自己去理解,别人讲了,你当时知道,过后又会忘记的
页: [1]
查看完整版本: 一个关于指针的问题 谢谢大家