广西美丽乡村建设网站,泰州高端网站建设,logo在线生成器免费,做网站会有侵权近期的天气是真的冷啊#xff0c;老铁们一定要照顾好自己呀#xff0c;注意防寒保暖#xff0c;没有你们我怎么活啊#xff01; 上次的指针2的末尾#xff0c;给大家分享了两个有趣的代码#xff0c;今天就先来讲一讲那两个代码#xff1a;
两个有趣的代码#xff1a;…近期的天气是真的冷啊老铁们一定要照顾好自己呀注意防寒保暖没有你们我怎么活啊 上次的指针2的末尾给大家分享了两个有趣的代码今天就先来讲一讲那两个代码
两个有趣的代码 1 ( * ( void (*) ( ) ) 0 ) ( ); 相同颜色的就是对应的一对括号我们从里面看着出来void (*) ( )这是一种指针类型吧然后就是( void (*) ( ) ) 0 表示将0地址强制转换为函数指针类型像我们之前写的int3.14这中就是强制类型转换之后还剩下*这个不就是函数的调用吗?所以这是一次函数调用将整数值0强制类型转换成一个函数地址这个函数没有参数返回类型为void; 去调用0地址处的函数. 2 void (*signal (int , void(*)(int) ) ) (int ); 我们还是从里面分析着出来首先看 signal (int , void(*)(int) )这不就是一个函数吗里面有两个参数第一个是int类型第二个是函数指针类型该指针指向的函数参数是int返回类型是voidsignal函数的返回类型是这种类型的void(*)(int)函数指针该指针指向的函数参数是int返回类型是void这是函数的声明 函数指针数组 函数指针数组是一个数组其元素都是指向函数的指针。它的定义形式如下 返回类型 (*指针数组名称[元素个数])(参数1类型, 参数2类型, ...); 其中返回类型是函数的返回类型指针数组名称是一个合法的标识符元素个数是指针数组中元素的个数。参数类型是函数的参数类型。 例如定义一个包含3个元素的函数指针数组每个元素都指向返回类型为int参数类型为int的函数可以如下定义int (* PArray[3] ) (int); PArray先和 [] 结合说明 PArray是数组数组的内容是 int (*)(int) 类型的函数指针。 这样PArray就是一个包含3个元素的函数指针数组每个元素都是指向返回类型为int参数类型为int的函数的指针。 函数指针数组的使用 我们编写计算器的实现 先看看第一种方法 #define _CRT_SECURE_NO_WARNINGS 1
#include stdio.hint 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;
}
void mune(void)
{printf(************************\n);printf(*****1,加法运算 ********\n);printf(*****2,减法运算 ********\n);printf(*****3,乘法运算 ********\n);printf(*****4,除法运算 ********\n);printf(*****0,退出计算 ********\n);printf(************************\n);}
int main()
{int input 0;int x 0;int y 0;int ret 0;do{mune();printf(请选择:\n);scanf(%d, input);switch (input){case 1:printf(请输入两个操作数:\n);scanf(%d %d, x, y);ret Add(x, y);printf(%d\n, ret);break;case 2:printf(请输入两个操作数:\n);scanf(%d %d, x, y);ret Sub(x, y);printf(%d\n, ret);break;case 3:printf(请输入两个操作数:\n);scanf(%d %d, x, y);ret Mul(x, y);printf(%d\n, ret);break;case 4:printf(请输入两个操作数:\n);scanf(%d %d, x, y);ret Div(x, y);printf(%d\n, ret);break;case 0:printf(退出计算器\n);break;default:printf(输入错误请重新输入\n);break;}} while (input);return 0;
} 这种方法相信大家都会的吧就是我们前面知识的应用就不和大家细说了。上面我们看见重复的代码太多了而且我们以后想实现其他的运算就会变得很麻烦。 上述的方法我们可不可以把它们进行封装到另一个函数里面呢通过函数指针找到相应的函数 #define _CRT_SECURE_NO_WARNINGS 1
#include stdio.hint input 0;
int x 0;
int y 0;
int ret 0;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;
}void mune(void)
{printf(************************\n);printf(*****1,加法运算 ********\n);printf(*****2,减法运算 ********\n);printf(*****3,乘法运算 ********\n);printf(*****4,除法运算 ********\n);printf(*****0,退出计算 ********\n);printf(************************\n);}void calc( int(*pf)(int, int))//函数指针
{printf(请输入两个操作数:\n);scanf(%d %d, x, y);ret pf(x, y);printf(%d\n, ret);
}
int main()
{do{mune();printf(请选择:\n);scanf(%d, input);switch (input){回调函数就是⼀个通过函数指针调⽤的函数。case 1:calc(Add);break;case 2:calc(Sub);break;case 3:calc(Mul);break;case 4:calc(Div);break;case 0:printf(退出计算器\n);break;default:printf(输入错误请重新输入\n);break;}} while (input);return 0;
} 我们来看看运行效果 我们可不可以把这些函数放在一个数组里面呢因为这些函数都是这一大类的吧弄一个函数指针数组然后根据输入去调用相应的函数 int (*parr[5]) (int, int) { NULL,Add,Sub,Mul,Div }; 前面加上一个空指针这样我们在输入数字的时候就可以找到相应的函数数组的下标是从0开始的 int main()
{int input 0;int x 0;int y 0;int ret 0;do{mune();printf(请选择:\n);scanf(%d, input);int (*parr[5]) (int, int) { NULL,Add,Sub,Mul,Div };//这里的函数指针数组我们称为转移表if (input 0){printf(退出计算器\n);}else if(input1 input4){printf(请输入两个操作数:\n);scanf(%d %d, x, y);ret parr[input](x, y);printf(%d\n, ret);}else{printf(输入错误请重新输入\n);}} while (input);return 0;
} 这样我们是不是就大大减少了我们的代码量了而且如果想加上其他的方法加在数组里面就可以了但这只是其中一部分代码哈前面的方法我没有写上。 好了今天就到这里了明天见哦不要太想我哟