指针与函数
- 跨函数间接引用局部变量的一般步骤:
- 主调函数中,将变量的地址作为实参 swap(&a,&b);如为数组,写为 fun(&a[0]) 或 fun(a),调用时只需传地址
- 被调函数中,定义指针形参 int *p
- 被调函数中,对指针形参内容改写完成需求 *p=...;如为数组,写为 *(p+i) =...,可用 p[i] 改写 *(p+i)
- 何时用普通变量作为形参,何时用指针变量作为形参?
- 若只需主调函数传给被调函数,用普通变量即可
- 若需将被调函数回传主调函数,用指针变量
1. 通过指针变量访问整型变量
#include <stdio.h> int main() { int a,b; int *p1,*p2; scanf("a=%d,b=%d",&a,&b); p1=&a; p2=&b; printf("*p1=%d,*p2=%d",*p1,*p2); return 0; }
2.1 输入两个整数,按先大后小的顺序输出。
要求:用指针方法处理。不交换整型变量的值,而是交换两个指针变量的值。
法一:交换引用内容(自定义函数使用该种方法)
#include <stdio.h> int main() { int a,b,p; int *p1,*p2; scanf("%d%d",&a,&b); p1=&a; p2=&b; if(a<b) { p=*p1; *p1=*p2; *p2=p; } printf("%d %d",*p1,*p2); //printf("%d %d",a,b); 此时引用内容改变,a,b的值改变 return 0; }
法二:那交换地址呢?
#include <stdio.h> int main() { int a,b; int *p1,*p2,*p; scanf("%d%d",&a,&b); p1=&a; p2=&b; if(a<b) { p=p1; p1=p2; p2=p; } printf("%d %d",*p1,*p2); //printf("%d %d",a,b); 此时指针地址改变,a,b的值不变 return 0; }
2.2 输入两个整数,按先大后小的顺序输出。
要求:用函数处理,而且用指针类型的数据作函数参数,在函数中通过指针交换两个变量值。
#include <stdio.h> int main() { void swap(int *p1,int *p2); int a,b; scanf("%d%d",&a,&b); if(a<b) { swap(&a,&b);//这里传递地址给被调函数 } printf("%d %d",a,b); return 0; } void swap(int *p1,int *p2)//这里定义指针变量 { int tmp;//这里不可定义野指针,来交换地址 tmp=*p1; *p1=*p2; *p2=tmp; }
3. 输入3个整数,按由大到小的顺序输出。
要求:用函数处理,且用指针做函数参数,实现交换两个数。
#include <stdio.h> int main() { void exchange(int *q1,int *q2,int *q3); int a,b,c; scanf("%d%d%d",&a,&b,&c); if((a<b)||(b<c)||(a<c)) { exchange(&a,&b,&c);//将地址传给被调函数 } printf("%d %d %d",a,b,c); return 0; } void exchange(int *q1,int *q2,int *q3)//定义指针变量 { void swap(int *pt1,int *pt2); if(*q1<*q2) { swap(q1,q2); } if(*q2<*q3) { swap(q2,q3); } if(*q1<*q2)//三个数比较大小,需要两趟;第一趟两次比较,第二趟一次比较 { swap(q1,q2); } } void swap(int *pt1,int *pt2) { int tmp; tmp=*pt1; *pt1=*pt2; *pt2=tmp; }
-END

浙公网安备 33010602011771号