#include <stdio.h> // void (*fun)(void) = &fun//函数指针 // void *fun(void){return 指针}//指针函数 因为优先级变了 //void (*fun(void/int/char op))(void){return 函数指针;}//函数指针作为返回值 //1. typedef int (*PTR)[3];//把int (*)[3] 换为 PTR //2. typedef void (*PTR_FUN)(void);//定义函数指针类型,满足返回值和参数都是void //相当于 void (*fun)(void) = &fun1; //但省去了两个void 和 * ,只需要PTR_FUN fun = &fun1; //typedef int* (*PTR_ARRAY)(int);//和上面一样,只是换了个返回值变成了指针 //3. //typedef void (*PTR_FUN_FUN)(int);//其实和上面定义类似 //void(*funA(int, void (*funB)(int)))(int); // || //void(*funA(参数))(int);//★★★:*funA后面还跟了参数列表,所以返回值是函数指针,参数列表中的funB也是函数指针, //★★★:所以是一个参数为一个int和一个函数指针,返回值为函数指针的函数 PTR_FUN funC(int n,PTR_FUN); PTR_FUN funC(int n,PTR_FUN funCptr)//调用哪个函数,调用几次,最后返回调用的函数指针 { for(int i = 0;i<n;i++) (*funCptr)(); return funCptr; } void fun1(void) { printf("fun1调用成功\n"); } void fun2(void) { printf("fun2调用成功\n"); } int main() { //1. printf("1.***********************************\n"); int array[3] = {1,2,3}; PTR ptr = &array;//取地址,相当于1行3列的二维数组 for(int i=0;i<3;i++) printf("%d\n",(*ptr)[i]); //2. printf("2.***********************************\n"); PTR_FUN ptr_fun1 = &fun1;//相当于 void (*fun)(void) = &fun1; (*ptr_fun1)(); PTR_FUN ptr_fun2 = &fun2; (*ptr_fun2)(); //!!!!!!!!!!!!!!!!!!!!!!!!!! PTR_FUN ptrfun[2]={&fun1,&fun2};//相当于数组,只不过是函数指针类型的数组,函数又是双void类型的 for(int i=0;i<2;i++) (*ptrfun[i])();//注意和1行n列数组一样 //如:(*p)(),(*p)[],因为[]和()都比*优先级高,所以要加上括号确保先解引用 //3. printf("3.***********************************\n"); funC(3,ptrfun[1]); return 0; }