当前位置:   article > 正文

C语言:指针学习(二)_指针p1指向变量a怎么写

指针p1指向变量a怎么写

主函数调用子函数,子函数的改变要想影响影响主函数,必须:

    1:传指针

    2:解引用


以下有三个案例是指针学习中最容易出现的问题(前提:交换两个变量a、b的值)

(一)第一种情况是没有传指针,也没有解引用。

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

该函数执行完成后,变量a和b的值只在子函数中交换成功,主函数中执行printf操作时,依然是a = 10;b = 20,详细情况如下图所示:



(二)第二种情况是传指针,但只改变两个指针变量的指向,并没有解引用

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

在执行子函数里的语句块前,指针变量p1和p2的指向详细情况如下图所示::


指针变量p1指向变量a,保存变量a的地址f854,指针变量p2指向变量b,保存变量b的地址f848。


接下来执行子函数里的语句块,结果如下图所示:


可以看到,在交换完成后,指针变量p1指向变量b,指针变量p2指向了变量a,不过在主函数里执行完printf后,变量a和b的值并没有交换,这是因为指针变量p1和p2只是交换了变量a和b的地址,并不会对主函数里的值产生影响,故该方法错误


(三)第三种错误是,定义了一个野指针\悬挂指针

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

前面提到过,子函数的改变要想影响主函数,必须1:传指针、2:解引用,在这段代码里,前面两个条件都达成了,我们来试试结果是否符合预期。

结果出现了如下所示debug error:

即变量tmp未被初始化。经过了解,这样定义的指针变量,被称为野指针或悬挂指针,由于未给tmp赋值,所以它指向的内存单元无法确定,向这样的未知单元赋值是不合法的,它有可能会对系统的正常工作带来影响。


(四)那么重新定义tmp为整型变量如下所示

  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. }
  9. int main()
  10. {
  11. int a = 10;
  12. int b = 20;
  13. Swap(&a,&b);
  14. printf("%d,%d\n",a,b);
  15. return 0;
  16. }

执行子函数语句块前的情况如图:


执行后的情况为:


指针变量p1指向变量a,*p1为20,指针变量p2指向变量b,*p2为10,执行完子函数的语句块后,主函数里的a和b成功重新赋值。



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

闽ICP备14008679号