从计算器了解函数指针
#include<stdio.h> void menu() { printf("********************************************\n"); printf("**** 1.+ 2.- *************\n"); printf("***** 3.* 4./ *************\n"); printf("***** 0.exit **************************\n"); printf("********************************************\n"); } int Add(int x, int y) { return x + y; } int Sub(int x, int y) { return x - y; } int Mul(int x, int y) { return x * y; } int Div(int x, int y) { return x / y; } int main() //计算器 //{ // int input = 0; // int x, y; // do // { // menu(); // printf("请选择你要的运算:>\n"); // scanf("%d", &input); // switch (input) // { // case 1: // printf("请输入你的两个操作数:>\n"); // scanf("%d %d", &x, &y); // printf("%d\n", Add(x, y)); // break; // case 2: // printf("请输入你的两个操作数:>\n"); // scanf("%d %d", &x, &y); // printf("%d\n", Sub(x, y)); // break; // case 3: // printf("请输入你的两个操作数:>\n"); // scanf("%d %d", &x, &y); // printf("%d\n", Mul(x, y)); // break; // case 4: // printf("请输入你的两个操作数:>\n"); // scanf("%d %d", &x, &y); // printf("%d\n", Div(x, y)); // break; // case 0: // printf("退出\n"); // break; // default: // printf("选择错误\n"); // break; // } // } while (input); // return 0; //}
函数指针,是指针,指向函数的指针,存放函数地址的指针(可以对比数组指针来思考)
函数里面 ,&函数名和函数名一样都是函数的地址,int(*pa)(intx,inty) 调用函数时(*pa)(2,3)(pa)(2,3)表示的函数调用一样,*pa=pa=函数名
(*(void(*)())0)()表示一个函数的调用,(void(*)())表示一个指针指向无形参不返回的函数
()强制类型抓换把0转换为那个指针,然后对0解引用,得到指针指向的函数在加()表示调用0指向的函数
void(*signal(int,void(*)(int)))(int)首先这是一个函数,里面的形参一个为整型,一个为函数指针类型,
把函数名形参去掉,得到函数的返回类型是,void(*)(int)返回类型是函数指针。
typedf void(*pfun)(int);类型重命名把函数指针类型重命名为pfun 上面写成 pfun signal(int,pfun)
int(*pa)(int,int)是指针指向函数的指针函数形参是两个整型,返回类型是整型
/int main() //{ // int(*pa)(int, int) = Add; // printf("%d\n", pa(2, 3)); // printf("%d\n", (*pa)(2, 3));//&函数名和函数名一样都是函数的地址,int(*pa)(intx,inty) 调用函数时(*pa)(2,3)(pa)(2,3)表示的函数调用一样,*pa=pa=函数名 // int i = 0; // int(*parr[4])(int, int) = {Add,Sub,Mul,Div};//int(*pa[4])(int,int)表示的就是数组了,数组里面4个元素每个元素的类型是int(*)(int,int)函数指针,这是一个函数指针的数组 // for ( i = 0; i < 4; i++) // { // printf("%d\n", parr[i](2, 3)); // } // return 0; //} //char* my strcpy(char*dest,const char*src)写一个函数指针存放my_strcpy的地址,写一个数组,里面存放4个my_strcpy的地址 //char* (*p) (char*,char*)=my_strcpy; //char* (*parr[4])(char*,char*)={my_strcpy,my_strcpy,my_strcpy,my_strcpy};
函数指针数组
int(*pa[4])(int,int)表示的就是数组了,数组里面4个元素每个元素的类型是int(*)(int,int)函数指针,这是一个函数指针的数组
指向函数指针数组的指针 int(*parr[4])(int,int)这是一个函数指针数组,怎么取地址交给一个指针
int(*p)[10]这个一个数组指针,存放数组的地址,想,
int(*(*pparr)[4])(int,int)=&parr pparr是一个数组指针,指针指向4个元素,里面元素的类型是函数指针
void menu() { printf("********************************************\n"); printf("**** 1.+ 2.- *************\n"); printf("***** 3.* 4./ *************\n"); printf("***** 0.exit **************************\n"); printf("********************************************\n"); } int Add(int x, int y) { return x + y; } int Sub(int x, int y) { return x - y; } int Mul(int x, int y) { return x * y; } int Div(int x, int y) { return x / y; } int main() { int input = 0; int x, y; int (*parr[5])(int x, int y) = {0,Add,Sub,Mul,Div }; do { menu(); printf("请选择你要的运算:>\n"); scanf("%d", &input); if (input >= 1 && input <= 4) { printf("请输入你的两个操作数:>\n"); scanf("%d %d", &x, &y); printf("%d\n", parr[input](x, y)); } else if (input == 0) { printf("退出\n"); } else printf("选择错误\n"); } while (input); }
这是一个函数指针数组,数组里面存放的是函数指针,通过指针找到函数调用