当前位置:   article > 正文

【C语言】利用指针实现a,b数值交换(swap),指针程序易错改正(程序注释详细)_c语言指针交换变量a和b的值

c语言指针交换变量a和b的值

目录

swap数值交换方法:

改进后的change3算法:


swap数值交换方法:

change2()与change3()方法正确,change1()为错误实例演示,运行程序可以看到指针指向地址数值,从而理解错误原因。(change3为改进算法)

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //int *p1,*p2,*p3;
  4. int main()
  5. {
  6. void change1(int *b1,int *b2);//声明函数
  7. void change2(int *b1,int *b2);//声明函数
  8. void change3(int *b1,int *b2);//声明函数
  9. printf("pointer!\n");
  10. int a1,a2,a3;
  11. a1=1; a2=2; a3=3;
  12. int *p1,*p2,*p3=&a3;
  13. //p3=&a3;
  14. p1=&a1;
  15. p2=&a2;
  16. printf("未互换地址时p1,p2,p3:%d,%d,%d\n",*p1,*p2,*p3);
  17. printf("----------------------------------------\n");
  18. printf("错误实例,仅改指针b1,b2值,p1,p3并未变\n");
  19. printf("未互换P:%d,%d,%d\n",p1,p2,p3);
  20. change1(p1,p3);//等价change(&a1,&a3);
  21. printf("互换后P:%d,%d,%d\n",p1,p2,p3);
  22. printf("互换地址后p1,p2,p3:%d,%d,%d\n",*p1,*p2,*p3);
  23. printf("----------------------------------------\n");
  24. //使用改进实例需要将其余部分注释掉,因为全局变量和局部变量重名冲突了
  25. // printf("改正实例:既然是p1,p2没交换,最后更改以下即可\n");//需要定义指针为全局变量
  26. // printf("p1=b1,p3=b2\n");
  27. // printf("未互换P:%d,%d,%d\n",p1,p2,p3);
  28. // change3(p1,p3);//等价change(&a1,&a3);
  29. // printf("互换后P:%d,%d,%d\n",p1,p2,p3);
  30. // printf("互换地址后p1,p2,p3:%d,%d,%d\n",*p1,*p2,*p3);
  31. //
  32. // printf("----------------------------------------\n");
  33. printf("正确实例:既然是a1,a2对象交换,函数就要进行对象的交换*p1,*p2\n");
  34. printf("p1->a1;temp=a1;p1=p2->a2;p2=temp->a1\n");
  35. printf("未互换P:%d,%d,%d\n",p1,p2,p3);
  36. change2(p1,p3);//等价change(&a1,&a3);
  37. printf("互换后P:%d,%d,%d\n",p1,p2,p3);
  38. printf("互换地址后p1,p2,p3:%d,%d,%d\n",*p1,*p2,*p3);
  39. printf("----------------------------------------\n");
  40. return 0;
  41. }
  42. void change1(int *b1,int *b2){
  43. int *b=NULL;//防止野指针
  44. b=b1;//b存b1存储的地址值
  45. b1=b2;
  46. b2=b;//b1 ,b2存储的地址值互换
  47. printf("互换后B:%d,%d\n",b1,b2);
  48. }
  49. void change3(int *b1,int *b2){
  50. int *b=NULL;//防止野指针
  51. b=b1;//b存b1存储的地址值
  52. b1=b2;
  53. b2=b;//b1 ,b2存储的地址值互换
  54. printf("互换后B:%d,%d\n",b1,b2);
  55. p1=b1;
  56. p3=b2;
  57. printf("互换后P:%d,%d\n",p1,p2);
  58. }
  59. void change2(int *b1,int *b2){
  60. int temp;//
  61. temp=*b1;//
  62. *b1=*b2;
  63. *b2=temp;//b1 ,b2存储的地址值互换
  64. printf("互换后B:%d,%d\n",b1,b2);
  65. }

改进后的change3算法:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int *p1,*p2,*p3;
  4. int main()
  5. {
  6. void change2(int *b1,int *b2);//声明函数
  7. printf("pointer!\n");
  8. int a1,a2,a3;
  9. a1=1; a2=2; a3=3;
  10. //int *p1,*p2,*p3=&a3;
  11. p3=&a3;
  12. p1=&a1;
  13. p2=&a2;
  14. printf("----------------------------------------\n");
  15. //使用改进实例需要将其余部分注释掉,因为全局变量和局部变量重名冲突了
  16. printf("改正实例:既然是p1,p2没交换,最后更改以下即可\n");//需要定义指针为全局变量
  17. printf("p1=b1,p3=b2\n");
  18. printf("未互换P:%d,%d,%d\n",p1,p2,p3);
  19. change3(p1,p3);//等价change(&a1,&a3);
  20. printf("互换后P:%d,%d,%d\n",p1,p2,p3);
  21. printf("互换地址后p1,p2,p3:%d,%d,%d\n",*p1,*p2,*p3);
  22. printf("----------------------------------------\n");
  23. return 0;
  24. }
  25. void change3(int *b1,int *b2){
  26. int *b=NULL;//防止野指针
  27. b=b1;//b存b1存储的地址值
  28. b1=b2;
  29. b2=b;//b1 ,b2存储的地址值互换
  30. printf("互换后B:%d,%d\n",b1,b2);
  31. p1=b1;
  32. p3=b2;
  33. printf("互换后P:%d,%d\n",p1,p2);
  34. }

【C语言】深入浅出谈指针:理解指针、指针定义和指针代码实例swap(代码详细注释,含易错实例以及改进办法)

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

闽ICP备14008679号