函数的参数不仅可以是整形,浮点型等数据,也可以是指针类型。他的作用是将一个变量的地址传送到另一个函数中。
下面通过一个例子来说明:
我们采用函数来处理,而且用指针类型的数据做函数的参数。
#include<stdio.h>
int main(){
void swap(int * point_1,int * point_2);
int *p1,*p2,a,b;
printf("please enter two integer number:");
scanf("%d,%d",&a,&b);
p1 = &a;
p2 = &b;
if(a<b)
swap(p1,p2);
// 如果 a < b,那么 a 和 b 的值进行了交换
// 如果打印了 *p1 和 *p2 我们会发现,p1 仍指向 a,p2 仍指向 b
printf("max=%d,min=%d\n",a,b);
return 0;
}
void swap(int * point_1,int * point_2){
int temp;
// 注意:这里是交换指针所指变量的值
// 即指针的指向没有发生改变
// 但是变量 a 和 b 的值改变了
temp = * point_1; //使 *p1 和 *p2 互换
*point_1 = * point_2;
*point_2 = temp;
}
程序分析:
swap 是用户自定义函数,它的作用是交换两个变量(a 和 b)的值。
swap 函数的两个形参 point_1 和 point_2 是指针变量。程序运行时,先执行 main 函数,输入 a 和 b 的值(我们输入的是 23 和 34),然后将 a 和 b 的地址分别赋给 int 指针变量 p1 和 p2,使 p1 指向 a,p2 指向 b,见下图 a,接着执行 if 语句,由于 a<b,因此执行 swap 函数。
注意实参 p1 和 p2 是指针变量,在函数调用时,将实参变量的值传送给形参变量,采取的依然是“值传递”方式。因此虚实结合后形参 point_1 的值是 &a,point_2 的值为 &b,见下图 b。这时 p1 和 point_1 都指向变量 a,p2 和 point_2 都指向变量 b。 接着执行 swap 函数的函数体,使 * point_1 和 * point_2 的值互换,也就是使 a 和 b 的值互换。互换后的情况见图 c。
函数调用结束后,形参 point_1 和 point_2 不复存在(已释放),情况如图 d,最后在 main 函数中输出的 a 和 b 的值已经是经过交换的值。
可以看到,在执行 swap
函数后,变量 a 和 b 的值改变了。
注意:请仔细分析,这个改变是怎么实现的,这个改变不是通形参值传回实参实现的。大家可以考虑下能否通过下面的函数实现 a 和 b 互换。
void swap(int x ,int y){
int temp;
temp = x;
x = y;
y = temp;
}
如果在 main
函数中调用 swap
函数:swap(a,b);
会有什么结果?
在函数调用时,a 的值传送给 x,b 的值传送给 y,执行完 swap
函数后,x 和 y 的值是互换了,但并未影响到 a 和 b 的值。
在函数结束时,变量 x 和 y 释放了,
main
函数中的 a 和 b 并未互换。也就是说,这种单向的值传递,形参值的改变不能使实参的值随之改变。
为了使在函数中改变了的变量值能被主调函数 main
所用,不能采取上述的把要改变的变量作为参数的办法,而应该用指针变量作为函数参数,在函数执行过程中使指针变量所指向的变量值发生变化,函数调用结束后,这些变量值依然保留了下来。
如果想通过函数调用得到 n 个要改变的值,可以这样做:
- 在主调函数中设 n 个变量,用 n 个指针变量指向它们;
- 设计一个函数,有 n 个指针形参,在这个函数中改变 n 个形参的值;
- 在主调函数中调用这个函数,在调用时将这 n 个指针变量作实参,将他们的地址传给该函数的形参;
- 在执行该函数的过程中,通过形参指针变量,改变它们所指向的 n 个变量的值;
- 主调函数中就可以使用这些改变了值的变量了。
大家是不是转的有点晕,相信小编,你把刚才的程序再写两遍,下面的这个程序练习再来好好写一遍并独立思考你绝对掌握了。输入 3 个整数 a,b,c 要求按从大到小的顺序将他们输出,用函数实现。
在函数中改变 3 个变量的值。用 swap
函数交换两个变量的值,用 exchange
函数改变着 3 个变量的值。
编写源程序 10-4.c:
#include<stdio.h>
int main(){
void exchange(int * q1,int * q2,int * q3);
int a,b,c,*p1,*p2,*p3;
printf("please enter 3 integer number:");
scanf("%d%d%d",&a,&b,&c);
p1 = &a;
p2 = &b;
p3 = &c;
exchange(p1,p2,p3);
printf("the order is :%d,%d,%d\n",a,b,c);
return 0;
}
void exchange(int *q1,int *q2,int *q3){
void swap(int *p1,int *p2);
if(* q1<* q2) swap(q1,q2);
if(* q1<* q3) swap(q1,q3);
if(* q2<* q3) swap(q2,q3);
}
void swap(int *p1,int *p2){
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
怎么样,你学废了么?