人之所以痛苦,那是因为你在成长。--------magic_guo
一个函数的执行过程:
在编译时,系统为函数代码块分配一块存储空间,生成一个指向函数的指针变量,这个指针变量指向函数的入口地址,依次自上而下指向每一条代码指令并执行指令。而这段存储空间的起始地址(又称入口地址)便称为这个函数的指针。
函数指针定义的一般形式:
类型名 ( 指针变量名)(函数参数列表)*
例如:
int ( * p)(int, int);
最前面的int表示这个函数的返回值是int类型的,注意 * p的括号不能省略,表示p先和 * 号结合,是指针变量;然后再与后面的括号结合,表示是函数,两个int表示,此函数接收两个int类型的参数。
当然,调用一个函数时,可直接调用函数名来使用函数;不过也可以通过指向函数的指针变量来调用该函数。
下面我们来看一看通过函数名调用函数和通过指针变量来调用函数的区别:
1.通过函数名调用函数
# include<stdio.h>
// 通过直接调用函数,求两个数的最大值
int main(void)
{
int max(int, int);
int a, b, c;
printf("please enter a and b:");
scanf("%d, %d", &a, &b);
c = max(a, b);
printf("a=%d\nb=%d\nmax=%d\n", a, b, c);
return 0;
}
int max(int x, int y)
{
int z;
if (x>y)
z = x;
else
z = y;
return z;
}
2.通过指针变量来调用函数
# include <stdio.h>
// 通过调用指向函数的指针,求两个数的最大值
int main(void)
{
int max(int, int);
int (* p)(int, int); //定义一个指向函数的指针变量p
int a, b, c;
p = max; //使p指向函数max,此时p和max都指向函数的开头,那么*p即是调用函数max
printf("please enter a and b: ");
scanf("%d,%d", &a, &b);
c = (* p)(a, b);
printf("a=%d\nb=%d\nmax=%d\n", a, b, c);
return 0;
}
int max(int x, int y)
{
int z;
if (x>y)
z = x;
else
z = y;
return z;
}
上述两种调用函数的方法不一样,但是结果是一样的。
如何使用指向函数的指针变量:
看例题:
使用户选择选项和两个值,来计算a和b的最大值或者最小值
# include <stdio.h>
int main(void)
{
int max(int, int);
int min(int, int);
int (* p)(int, int);
int a, b, c, n;
printf("please enter tow numbers so that we can compare their value: ");
scanf("%d, %d", &a, &b);
printf("please choose:\n");
printf("1. calculate the max one!\n");
printf("2. calculate the min one!\n");
printf("input: ");
scanf("%d", &n);
if (n==1)
p = max;
else
p = min;
c = (* p)(a, b);
printf("a = %d, b = %d\n", a, b);
if (n==1)
printf("max = %d\n", c);
else
printf("min = %d\n", c);
return 0;
}
int max(int x, int y)
{
int z;
if (x>y)
z = x;
else
z = y;
return z;
}
int min(int x, int y)
{
int z;
if (x<y)
z = x;
else
z = y;
return z;
}
使用指向函数的指针作为函数参数:
例题:用户输入两个值,再进行选择,根据不同的选择(最大值、最小值、两个数的和),计算出不同的值。
# include <stdio.h>
int main(void)
{
int fun(int x, int y, int (* p)(int, int));
int max(int, int);
int min(int, int);
int add(int ,int);
int a, b, n;
printf("plsese enter tow nmubers: ");
scanf("%d,%d", &a, &b);
printf("please choose the number:\n");
printf("1. calculate the max value!\n");
printf("2. calculate the min value!\n");
printf("3. calculate the add value!\n");
printf("inter the option: ");
scanf("%d", &n);
if (n==1) fun(a, b, max);
else if(n==2) fun(a, b, min);
else if(n==3) fun(a, b, add);
return 0;
}
int fun(int x, int y, int (* p)(int ,int) )
{
int result;
result = (*p)(x, y);
printf("%d\n", result);
return result;
}
int max(int x, int y)
{
int z;
if (x>y) z=x;
else z = y;
printf("max = ");
return z;
}
int min(int x, int y)
{
int z;
if (x<y) z=x;
else z = y;
printf("min = ");
return z;
}
int add(int x, int y)
{
int z;
z = x + y;
printf("add = ");
return z;
}
看完这几段代码,大家会觉得:既然直接调用函数那么简单,为什么我还要使用指向函数的指针来调用函数的方法呢?
答:如最后一段代码;在一个程序中,如果我们只用到少数函数,那么我们完全可以直接使用调用函数来完成需求。但是,如果在每次调用fun函数时,每次调用的函数是不固定的,而且函数的数量很多,这时我们使用指针变量就很方便了;只需要在每次调用时给出要调用的函数名和参数作为实参就可以。这样符合程序的结构化设计原则。