以指针变量作为函数参数进行数值交换的三种错误情况的理解

  指针可以作为函数形参来使用,它的作用是把地址传给被调函数。下面通过一个示例来说明。


eg:输入a和b,按从小到大的顺序输出。

  1. void swap(int *p1,int *p2)
  2. {int t;
  3. t=*p1;
  4. *p1=*p2;
  5. *p2=t;}
  6. void main()
  7. {int a,b;
  8. int  *q1,*q2;
  9. q1=&a;
  10. q2=&b;
  11. scanf("%d,%d",q1,q2);
  12. printf("%d,%d\n",q1,q2);
  13. if(a>b) swap(q1,q2);
  14. printf("%d %d",a,b);
  15. printf("%d %d",q1,q2);
  16. }

运行情况:9,3(输入9,3并回车)

_ _, _ _(输出的结果,此处分别为数值9和3的地址,具体值由编译器环境决定)

3,9

_ _, _ _(输出的结果,此处地址与前一次相同)


以下3种情况需特别注意。

(1)swap函数中的中间变量定义成指针类型变量。

  1. void swap(int *p1,int *p2)
  2. {int *t;
  3. *t=*p1;
  4. *p1=*p2;
  5. *p2=*t;}

  *t是指针变量t所指向的变量。由于未给t赋具体地址,因此,t中的值是不可预见的。所以t所指向的单元也是不可预见的。所以,对*t赋值就是向一个未知的存储单元赋值,而这个存储单元可能存在着一个有用的数据,这样就可能破坏系统的正常工作状况。

打比方:若招生就业办公室地址为p1,教学秘书办公室地址为p2,现要令招生就业负责人和教学秘书负责人分别到对方办公室值班(a和b交换数值),需要通过上级部分审批(借助交换变量t),该上级部门没有审批权限(指针变量t由于未被赋给具体的地址,而不能进行取值运算,从而导致语法错误。)

 

(2)被调函数中的地址交换

  1. void swap(int *p1,int *p2)
  2. {int *t;
  3. t=p1;
  4. p1=p2;
  5. p2=t;}

  swap函数调用结束后,变量a和b中的值没有交换。原因是函数swap交换了变量p1,p2的值,无法通过值传递形式返回主函数中的p1,p2。

21d9f6e0cb74436192f117a59217839e.jpg

 打比方:若招生就业办公室地址为p1,教学秘书办公室地址为p2,现要令招生就业负责人和教学秘书负责人分别到对方办公室值班(a和b交换数值),上报给上级部门后(借助交换变量t),上级部门下达了两个办公室的搬迁的错误指示(p1,p2交换地址),两名负责人也与“招生就业”“教学秘书”的名称发生了同步移动,最终并没有实现到对方办公室值班的目的。(通过名称对应的内容或值不发生改变。)

 

(3)普通变量作为函数参数

  1. void swap(int x,int y)
  2. {int t;
  3. t=x;
  4. x=y;
  5. y=t;}
  6. main ()
  7. {
  8. swap(a,b)
  9. }

  主函数中直接将a,b作为实参传递给swap函数,形参数据在swap函数中交换后并不返回主函数。

8cc3e1e88c624c4e8c93cc14030fce3c.jpg

 打比方:招生就业负责人和教学秘书负责人分别位于各自的办公室中,现计划上级部门批准(借助交换变量t),令两位负责人分别到对方办公室中值班,但该计划未付诸实施。(由于函数返回值为空值,因此实参不发生变化。)

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风雪心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值