指针可以作为函数形参来使用,它的作用是把地址传给被调函数。下面通过一个示例来说明。
eg:输入a和b,按从小到大的顺序输出。
- void swap(int *p1,int *p2)
- {int t;
- t=*p1;
- *p1=*p2;
- *p2=t;}
- void main()
- {int a,b;
- int *q1,*q2;
- q1=&a;
- q2=&b;
- scanf("%d,%d",q1,q2);
- printf("%d,%d\n",q1,q2);
- if(a>b) swap(q1,q2);
- printf("%d %d",a,b);
- printf("%d %d",q1,q2);
- }
运行情况:9,3(输入9,3并回车)
_ _, _ _(输出的结果,此处分别为数值9和3的地址,具体值由编译器环境决定)
3,9
_ _, _ _(输出的结果,此处地址与前一次相同)
以下3种情况需特别注意。
(1)swap函数中的中间变量定义成指针类型变量。
- void swap(int *p1,int *p2)
- {int *t;
- *t=*p1;
- *p1=*p2;
- *p2=*t;}
*t是指针变量t所指向的变量。由于未给t赋具体地址,因此,t中的值是不可预见的。所以t所指向的单元也是不可预见的。所以,对*t赋值就是向一个未知的存储单元赋值,而这个存储单元可能存在着一个有用的数据,这样就可能破坏系统的正常工作状况。
打比方:若招生就业办公室地址为p1,教学秘书办公室地址为p2,现要令招生就业负责人和教学秘书负责人分别到对方办公室值班(a和b交换数值),需要通过上级部分审批(借助交换变量t),该上级部门没有审批权限(指针变量t由于未被赋给具体的地址,而不能进行取值运算,从而导致语法错误。)
(2)被调函数中的地址交换
- void swap(int *p1,int *p2)
- {int *t;
- t=p1;
- p1=p2;
- p2=t;}
swap函数调用结束后,变量a和b中的值没有交换。原因是函数swap交换了变量p1,p2的值,无法通过值传递形式返回主函数中的p1,p2。
打比方:若招生就业办公室地址为p1,教学秘书办公室地址为p2,现要令招生就业负责人和教学秘书负责人分别到对方办公室值班(a和b交换数值),上报给上级部门后(借助交换变量t),上级部门下达了两个办公室的搬迁的错误指示(p1,p2交换地址),两名负责人也与“招生就业”“教学秘书”的名称发生了同步移动,最终并没有实现到对方办公室值班的目的。(通过名称对应的内容或值不发生改变。)
(3)普通变量作为函数参数
- void swap(int x,int y)
- {int t;
- t=x;
- x=y;
- y=t;}
- main ()
- {
- …
- swap(a,b)
- …
- }
主函数中直接将a,b作为实参传递给swap函数,形参数据在swap函数中交换后并不返回主函数。
打比方:招生就业负责人和教学秘书负责人分别位于各自的办公室中,现计划上级部门批准(借助交换变量t),令两位负责人分别到对方办公室中值班,但该计划未付诸实施。(由于函数返回值为空值,因此实参不发生变化。)