当前位置:   article > 正文

【C语言】两个变量值的交换——指针_c语言指针交换两个变量的值

c语言指针交换两个变量的值

     C语言中交换两个变量的值可以在主函数中直接实现,也可以通过子函数来实现。下面我们介绍用子函数实现的情况。

    1.将两个变量的值作为实参直接传递,在子函数内部定义一个普通变量来对两个形参进行交换,并分别在子函数和主函数中打印。

  1. #include <stdio.h>
  2. void Swap(int a,int b)
  3. {
  4. int tmp = a;
  5. a = b;
  6. b = tmp;
  7. printf("a=%d,b=%d\n",a,b);
  8. }
  9. int main()
  10. {
  11. int a = 5;
  12. int b = 10;
  13. printf("a=%d,b=%d\n",a,b);
  14. Swap(a,b);
  15. printf("a=%d,b=%d\n",a,b);
  16. return 0;
  17. }

      下面是程序的运行结果:

     从程序的运行结果我们可以看出,在子函数内部两个形参是交换成功了的,但是在主函数中却没有。那是为什么呢?我们进入函数内部来看下。

     下面是主函数中a和b的地址及值:

      下面是子函数中a和b的地址及值:

       可以看出主函数和子函数中a和b的地址不相同,即说明了两个函数中的变量不是同一个,仅仅是同名而已。这说明了两个形参已交换成功,但并未传递给实参,两个实参的值并未发生改变。

      2.第一种方法中两个实参并未发生改变,因为其地址并未传递给形参。接下来我们把实参的地址传递给形参,并且定义一个指针变量来对两个形参进行交换,并分别在子函数和主函数中打印。

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

     下面是程序的运行结果:

     可以看出结果还是同样错误。我们进行测试。

     下面是主函数中a和b的地址及值:

 

    下面是子函数中a,b,p1,p2的地址及值:

 

    下面是返回到主函数中四个变量的地址及值:

 

 

      以上测试结果可以说明主函数在给子函数传参时,传的是主函数中的两个变量的地址,但是在子函数中只是把形参p1和p2所指向的变量的地址进行交换,开始p1指向a,p2指向b,交换之后,p1指向b,p2指向a,没有实质性的将实参a,b的值交换。然后返回到主函数中,a和b依然是原来的值,没有交换。

     3.下面在子函数中将实参值进行交换。

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

    以上方法看似没有错误,但是在运行时程序却会崩溃:

    上边显示,变量tmp正在被使用却没有被初始化。这种没有被初始化的指针称为野指针,也叫悬挂指针。野指针是没有访问权限的地址(指针)。没有访问权限,形参不能正常交换,所以程序崩溃。

    4.下面才是正确的写法。

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

 

    由此可以总结出学习指针的一个重要知识点:一个函数的改变要影响另一个函数,两个条件:1.传指针;2.解引用。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/思考机器/article/detail/63026
推荐阅读
相关标签
  

闽ICP备14008679号