什么是函数指针?
一个函数在编译时被分配一个入口地址,这个函数的入口地址就称为 函数的指针。
{ 可以用一个指针变量指向函数,然后通过该指针变量调用此函数}
定义形式:
数据类型 (* 指针变量名)(函数参数列表);
不论调用max , min , add , 函数process 一点都没有改动,只是在调用process 函数时改变实参函数名而已。这种方式:增加了函数使用的灵活性。
一个函数在编译时被分配一个入口地址,这个函数的入口地址就称为 函数的指针。
{ 可以用一个指针变量指向函数,然后通过该指针变量调用此函数}
定义形式:
数据类型 (* 指针变量名)(函数参数列表);
应用举例:
#include<stdio.h>
void main()
{
int max(int , int );
int (*p)(int ,int); // 定义 p 是一个指向函数的指针变量
int a, b , c;
p = max; // 将函数max 的入口地址赋给指针变量。
scanf("%d , %d" , &a , &b);
c = (*p)(a , b); // 和 c = max(a , b); 等价
printf("a = %d , b = %d , max = %d \n" , a , b , c);
}
int max(int x , int y)
{
int z ;
if( x > y)
z = x;
else
z = y;
return (z);
}
说明:
(1) int ( *p )(int , int); 表示定义了一个指向函数的指针变量p ,它不是固定指向那个函数的,而只是表示定义了这样一个类型的变量,它是专门用来存放函数的入口地址的,
在程序中把哪一个函数(函数值为整型,参数也为整型)的地址赋给它, 它就指向哪一个函数,在一个程序中, 一个指针变量可以先后指向同类型的不同函数。
(2)在给函数指针变量赋值时,只需给出函数名而不必给出参数,eg:
p = max ; 而不能写成 p = max(a , b);
应用举例2:
设一个函数process , 在调用它的时候,每次实现不同的功能。输入a 和 b 两个数,第一次调用process 找出a 和b 中大者,第二次找出其中小者, 第三次求a 与b 之和。
#include<stdio.h>
void main()
{
int max(int ,int);
int min(int ,int);
int add(int , int );
void process(int ,int , int(* fun )(int ,int));
int a , b;
printf("enter a and b :\n");
scanf("%d,%d" , &a , &b);
printf("max = ");
process(a , b , max);
printf("min = ");
process(a , b , min );
printf("sum = ");
process(a , b , add);
}
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);
}
int add(int x , int y)
{
int z ;
z = x + y;
return (z);
}
void process(int x , int y , int (* fun )( int , int))
{
int result ;
result = (* fun)(x , y);
printf("%d\n" , result);
}
不论调用max , min , add , 函数process 一点都没有改动,只是在调用process 函数时改变实参函数名而已。这种方式:增加了函数使用的灵活性。