C语言----深入理解指针(3)(一)https://developer.aliyun.com/article/1544348
4.函数指针变量
变量有地址,数组有地址,函数是否有地址呢?
/*int Add(int x, int y) { return x + y; } int main() { printf("%p\n", &Add);//地址是00701040 printf("%p\n", Add);//地址是00701040 //这两种写法没区别 //如果想将函数名存起来怎么搞呢? int(*pf)(int,int) = &Add;//函数指针变量 //*和pf结合,表示pf是指针变量 //后面的(int,int)是指向的那个函数的参数 //前面的int是指向的那个函数的返回类型 //那么pf的指针类型是什么呢? //int(*)(int,int)---pf的类型 //交代pf指向的函数的参数个数和类型就行 //那我们能通过这个pf调用这个函数呢? int ret=(*pf)(4, 5);//pf是地址,加*解引用,然后得到函数后咱们就要提供数据,传参,在后面的括号内添加数据 printf("%d", ret);//打印的结果就是9 //int ret =Add(4,5) //还存在一种写法:int ret=pf(4, 5);---直接用过pf找到函数,因为pf里面存放的是函数的地址 //只要是函数指针变量就能这么写,可以不写* //如果要写*的话,那么就要带上括号 //通过函数的地址,也能调用函数 return 0; }*/
//对于这种复杂的代码,我们应该如何简单化呢? return 0; }*/ /*typedef unsigned int unit;//将unsigned int类型的数重定义名字为unit int main() { unsigned int num;//把一个相对长的类型简单化了 unit num2; //上面两个代码的内容是一样的 return 0; }*/ //typedef是用于类型重命名的,可以将复杂的类型简单化 //但如果是指针,能否重命名呢? //typedef int* pint_t; //int main() //{ // pint_t p2;//整形指针 // // // // return 0; //} //那么对于复杂点的数组指针和函数指针该如何命名呢? /*typedef int(*parr_t)[6]; //对于数组指针重命名时,新的名字应该放在*的旁边 int main() { int arr[6] = { 0 }; int(*p)[6]= & arr;//当我们把名字去掉,那么剩下的就是p的类型了 //p是指针变量的的名字 //在重新定义的时候,新的名字放在原本p的位置 parr_t p2; return 0; }*/ //现在对函数重命名 /*typedef int(*pf_t)(int, int);//函数的重命名还是把新名字放到*号旁边 Add(int x, int y) { return x + y; } int main() { int(*pf)(int ,int)=Add;//去掉名字就是函数指针类型 pf_t pf2 = Add; return 0; }*/
整型指针、数组指针、函数指针
5.函数指针数组
int Add(int x, int y) { return x + y; } int Sub(int x, int y) { return x - y; } int Mull(int x, int y) { return x * y; } int Div(int x, int y) { return x / y; } //指针数组 int main() { //int* arr1[6];整型指针数组 //char* arr2[5];字符指针数组 //arr[3][5];//每个元素是函数---函数指针数组 int (*pf1) (int ,int) = Add; int (*pf2) (int, int) = Sub; int (*pf3) (int, int) = Mull; int (*pf4) (int, int) = Div; //函数指针数组来存放这些函数的地址呢? //函数指针数组从函数指针的基础来写 int (*pf[4]) (int, int) = { Add, Sub ,Div ,Mull };//将函数指针放到函数指针数组里面 //通过下标来找数据 for (int i = 0; i < 4; i++) { int ret=pf[i](6,2);//后面的括号内放的是计算的数据 printf("%d\n", ret); } return 0; }
从函数指针的基础来写函数指针数组来写是最方便的
存放的都是相同类型的元素
6.转移表
函数指针数组
创建函数指针数组来调用
//实现一个计数器 //完成加减乘除 /*int Add(int x, int y)//加法 { return x + y; } int Sub(int x, int y)//减法 { return x - y; } int Mull(int x, int y)//乘法 { return x * y; } int Div(int x, int y)//除法 { return x / y; } void menu() { printf("**************************************************\n"); printf("************ 1. add 2. sub *************\n"); printf("************ 3. mull 4. div *************\n"); printf("************** 0. exit *************\n"); } int main() { int input = 0; int x =0, y = 0,ret=0; do { menu();//菜单 printf("请选择"); scanf("%d", &input); switch (input)//判断输入的值 { case 1: printf("请输入两个操作数"); scanf("%d %d", &x, &y);//输入数字 //调用函数Add ret=Add(x, y); printf("%d\n", ret); break; case 2: printf("请输入两个操作数"); scanf("%d %d", &x, &y);//输入数字 //调用函数Sub ret = Sub(x, y); printf("%d\n", ret); break; case 3: printf("请输入两个操作数"); scanf("%d %d", &x, &y);//输入数字 //调用函数Mull ret = Mull(x, y); printf("%d\n", ret); break; case 4: printf("请输入两个操作数"); scanf("%d %d", &x, &y);//输入数字 //调用函数Div ret = Div(x, y); printf("%d\n", ret); break; case 0: printf("退出计算器\n"); break; default://输入的值不是这里面的任何的一个值 printf("选错了,重新选择\n"); break; } } while (input); return 0; }*/ //这种写法过去复杂,对于不同符号的计算 // //将这些函数的地址放到 一个指针数组里面 int Add(int x, int y)//加法 { return x + y; } int Sub(int x, int y)//减法 { return x - y; } int Mull(int x, int y)//乘法 { return x * y; } int Div(int x, int y)//除法 { return x / y; } void menu() { printf("**************************************************\n"); printf("************ 1. add 2. sub *************\n"); printf("************ 3. Mull 4. div *************\n"); printf("************** 0. exit *************\n"); } int main() { int input = 0; int x =0, y = 0,ret=0; //创建一个数组放函数 //函数指针数组---转移表 int (*pfArr[5])(int, int) = {0, Add,Sub,Mull,Div}; // 0 1 2 3 4 下标 do { menu();//菜单 printf("请选择"); scanf("%d", &input); if (input >= 1 && input <= 4) { printf("请输入两个操作数"); scanf("%d %d", &x, &y);//输入要运算的数字 ret = pfArr[input](x, y);//通过数组下标访问数组内存放的函数,再通过输入再传入数据进行计算 printf("%d\n", ret);//直接调用数组内的函数 } else if (input == 0) { printf("退出计数器\n"); } else//选择的不是这些值 { printf("选择错误,重新选择\n"); } } while (input); return 0; } //通过数组的方式把函数都调用起来,用过下标找到函数再进行调用