C语言可以定义指针变量指向函数,通过指针来调用函数。
使用:
1、定义函数指针变量: 函数返回值类型(*指针变量名)();
2、将已有函数入口赋值给函数指针变量:fnPt = avg;
3、使用指针变量调用函数:(*指针变量名)(参数);
注意:看了一些参考资料里,声明函数指针时不用指定参数类型,但实际编辑时又提示指定参数类型才可以。
例如例子中的 int (*fnPt)(int*, int) = zhizhentest3_1_max; 这里就需要带上参数类型才行,否则编译时报错。
例子:定义函数指针变量,将不同函数赋值给指针变量,调用函数。
#include //求最大值
int zhizhentest3_1_max(int* data, int len){
int max = *data;//获取数组首地址对应的元素值
//通过指针+1来获取下一个元素的地址
for(int* p=data; p < data+len; p++){
if(*p > max) max = *p;
}
return max;
}
//求平均值
int zhizhentest3_2_avg(int* data, int len){
int sum = 0;
for(int* p=data; p < data + len; p++){
sum +=*p;
}
return sum/len;
}
//函数指针变量作为函数参数
void zhizhentest3_3_map(int* data, int len, int (*fn)(int)){
for(int* p = data; p < data + len; p++){
printf("%d, ", (*fn)(*p));
}
printf("\n");
}
//不变
int zhizhentest3_4_nochange(int val){
return val;
}
//求平方
int zhizhentest3_5_square(int val){
return val * val;
}
//求立方
int zhizhentest3_6_cube(int val){
return val * val * val;
}
//返回指针的函数
int* zhizhentest3_7_map(int* data,int len, int (*fn)(int)){
static int result[5];
int i=0;
for(int* p = data; p < data + len; p++){
result[i++] = (*fn)(*p);
}
return result;
}
void zhizhentest3main(){
int arr[5] = {4,7,2,3,9};
int (*fnPt)(int*, int) = zhizhentest3_1_max;//定义返回值为int型的函数指针变量*fnPt,并将zhizhentest3_1_sum函数入口赋给fnPt
int max = (*fnPt)(arr,5);//通过函数指针变量调用函数,传入参数
printf("max=%d\n", max);
fnPt = zhizhentest3_2_avg;//将zhizhentest3_2_avg函数入口赋给指针变量fnPt
int avg = (*fnPt)(arr,5);
printf("avg=%d\n", avg);
printf("\n");
printf("数组元素为:\n");
zhizhentest3_3_map(arr,5,zhizhentest3_4_nochange);
printf("元素求平方:\n");
zhizhentest3_3_map(arr,5,zhizhentest3_5_square);
printf("元素求立方:\n");
zhizhentest3_3_map(arr,5,zhizhentest3_6_cube);
printf("\n");
int* result1 = zhizhentest3_7_map(arr,5,zhizhentest3_4_nochange);
printf("返回的指针数组元素为:\n");
for(int* p1 = result1; p1 < result1 + 5; p1++){
printf("%d, ", *p1);
}
printf("\n");
int* result2 = zhizhentest3_7_map(arr,5,zhizhentest3_5_square);
printf("返回的数组平方元素为:\n");
for(int* p2 = result2; p2 < result2 + 5; p2++){
printf("%d, ", *p2);
}
printf("\n");
int* result3 = zhizhentest3_7_map(arr,5,zhizhentest3_6_cube);
printf("返回的数组立方元素为:\n");
for(int* p3 = result3; p3 < result3 + 5; p3++){
printf("%d, ", *p3);
}
printf("\n");
}输出: