方案1:不使用指针

  如果不使用指针交换两个变量的值,坦白来说是个不可能完成的任务,你可能会写成这样的:
  

#include "stdio.h"

void swap(int a,int b)
{
    int temp;
    temp = a;
    a = b;
    b = a;
}

int main()
{
    int m = 1,n = 2;
    swap(m,n);
    printf(交换之后m和n的值是:m = %d,n = %d\n",m,n);
}

  那么,恭喜你,你错了。
  在这里调用swap函数,将m和n的值复制一下,传给了函数的形参,然后swap函数开始作交换,其实这时已经跟m和n没有半毛钱的关系了,并且,swap函数处理完之后也没有将交换的结果重新再赋给m和n。所以,这个方案不可行,没有交换成功。

方案2:使用指针交换两个变量的地址

  理想是这样的:既然变量的数据保存在内存的某个地址之中,那么,我如果交换这两个变量的地址,那么我就能交换这两个变量的值了!
  可是,我偏偏用如下这个代码来实现,找虐脑细胞啊:

#include "stdio.h"

//交换两个变量的地址
void swap1(int *p1,int *p2)
{
    int *p_temp;
    p_temp = p1;
    p1 = p2;
    p2 = p_temp;
}

int main()
{

    int a = 1,b = 2;
    printf("swap1交换a-b之前:%d,%d\n",a,b);
    printf("swap1交换a-b之前a和b的地址:%p,%p\n",&a,&b);

    swap1(&a,&b);
    printf("swap1交换a-b之后:%d,%d\n",a,b);
    printf("swap1交换a-b之后a和b的地址:%p,%p\n",&a,&b);

}

  
  一看结果就傻眼了:
  这里写图片描述
  a和b的值并没有交换成功,更不解的是两个变量的地址也没有改变!!!
  其实,这次犯的错误跟方案1所犯的错误一模一样:将变量a和b的地址复制了一份传给了swap1函数,swap1函数将两个数交换了一下就结束了。然后呢?没有然后了!!!没有将交换的结果传出来,对变量a和b的地址没有丝毫的影响!!!
  不过,可惜的是,我到现在还不知道如何通过交换两个变量的地址而达到交换两个变量的值的结果。

方案3:使用指针交换两个变量的值

  交换变量地址指向的值。
  代码如下:
  

#include "stdio.h"


//交换两个变量的值
void swap2(int *p1,int *p2)
{
    int temp;
    temp = *p1;
    *p1 = *p2;
    *p2 = temp;

}



int main()
{

        int c = 3,d = 4;
        printf("swap2交换c-d之前:%d,%d\n",c,d);

        swap2(&c,&d);
        printf("swap2交换c-d之后:%d,%d\n",c,d);

}

  注意:这次之所以能够成功,是因为将变量a和b的地址复制一份传给了swap2函数,而swap2函数也毫不客气,直接处理地址对应的变量(*p1 = *p2;这里的星号应理解为“访问指针指向的变量”应理解为),结果可想而知,目的达成。
  

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐