一.指向函数的指针
1.概念:如果在程序中定义了一个函数,在编译时,编译系统为函数代码分配一段存储空间,这段存储空间的起始地址(又称入口地址)称为这个函数的指针。
2.定义方式:
类型名 (*指针变量名)(函数参数表列);
例如:int (*p)(int,int);
3.注意事项
(1)定义p是一个指向函数的指针变量,它可以指向函数的类型为整型且有两个整型参数的函数。需要特别注意的是,指向函数的指针变量只能指向在定义时指定的类型的函数。例如上述的指针变量p只能指向函数返回值为整型且有两个整型参数的函数。
(2)用函数指针变量调用函数时,只需将(*p)代替函数名即可
4.代码举例
#include <stdio.h>
#include <stdlib.h>
int max(int a,int b);
int main(){
int (*p)(int,int);
p = max;
int c = (*p)(5,7); //使用指针变量调用函数
printf("%d\n",c);
return 0;
}
/*
求a和b的最大值
*/
int max(int a,int b){
if(a>b){
return a;
} else {
return b;
}
}
二.返回指针值的函数
1.返回指针类型的数据即地址
2.定义方式
类型名 * 函数名(参数列表)
例如: int * max(int a,int b);
注意和指向函数的指针相区别,上述表达式中max先与括号结合,形成函数的形式,然后在于指针结合表示函数的指针为返回值的形式
3.代码举例
#include <stdio.h>
#include <stdlib.h>
int *pmax(int array[],int n);
int main(){
int array[5] = {34,76,89,44,20};
int * q = pmax(array,5);
printf("%d\n",*q);
return 0;
}
/*
返回指针的函数,求数组的最大值
*/
int *pmax(int array[],int n){
int i,max = -100,index;
for(i=0;i<n;i++){
if(array[i]>max){
max = array[i];
index = i;
}
}
return array+index;
}
三.用指向函数的指针当参数
#include <stdio.h>
#include <stdlib.h>
int max(int a,int b);
int min(int a,int b);
void fun(int a,int b,int (*p)(int,int));
int main(){
int opt;
int a = 100,b=101;
printf("输入1求a,b的最小值,2求a和b的最大值:\n");
scanf("%d",&opt);
if(opt==1){
fun(a,b,min);
} else {
fun(a,b,max);
}
return 0;
}
/*
选择执行求最大值的函数和最小值的函数
*/
void fun(int a,int b,int (*p)(int,int)){
int c = (*p)(a,b);
printf("%d\n",c);
}
/*
求a和b的最大值
*/
int max(int a,int b){
if(a>b){
return a;
} else {
return b;
}
}
/*
求a和b的最小值
*/
int min(int a,int b){
if(a>b){
return b;
} else {
return a;
}
}