1.1 用函数指针调用执行函数
(1) 用函数指针来指向不同的函数来实现同一个调用执行不同的结果
//此程序用来实现函数指针调用执行函数来实现类似于计算机计算两个整形类型的 + - * / 计算
#icnlude <stdio.h>
typedef int (*pfunc) (int , int); //重命名函数指针类型
//函数声明
int add(int a, int b);
int minus (int a, int b);
int ride(int a,int b);
int division(int a,int b);
int main(void)
{
int a = 0,b = 0;
char c = 0;
int ret = 0;
pfunc p1 = NULL; //定义一个函数指针赋值为NULL
printf("Please enter two integers:\n"); //提醒用户输入两个整数
scanf("%d %d",&a,&b); //用户输入两个数存放到a b 两个变量中
printf("Please enter the operator you want to perform: + - * / \n");
//正常逻辑思维是直接调用scanf函数输入操作符,但是由于是在linux操作系统下的终端进行的编译执
//行所以这里要用do while循环来等待linux判断行缓冲完成
do
{
scanf("%c\n",&c);
}while(c == '\n')
switch (c) //用switch判断用户输入的操作符然后让函数指针指向执行函数
{
case +: p1 = add; break;
case -: p1 = minus; break;
case *: p1 = ride; break;
case /: p1 = division; break;
default: p1 = NULL; break;
}
ret = p1(a,b); //用函数指针调用执行函数完成计算赋值给ret
printf("%d %c %d = %d\n",a,c,b,ret);
return 0;
}
/*
函数名 :add
函数功能:进行两个整数的加法
参数 :a b
返回值 :a + b
*/
int add(int a, int b)
{
return a + b;
}
/*
函数名 :minus
函数功能:进行两个整数的减法
参数 :a b
返回值 :a - b
*/
int minus (int a, int b)
{
return a - b;
}
/*
函数名 :ride
函数功能:进行两个整数的乘法
参数 :a b
返回值 :a * b
*/
int ride(int a,int b)
{
return a * b;
}
/*
函数名 :division
函数功能:进行两个整数的除法
参数 :a b
返回值 :a / b
*/
int division(int a,int b)
{
return a / b;
}
(2)如果学过c++或者java或者c#等面向对象语言,就会知道面向对象三大特征中有一个多态。多态就是同一个执行实际结果不一样,跟我们这里看到的现象其实是一样的。
(3)对于用简单函数指针调用执行函数的代码实战调试中得到很多信息
第一:当程序出现段错误时,第一步先定位段错误。定位的方法就是在可疑处加打印信息,从而锁定导致段错误的语句,然后集中分析这句为什么会有段错误。
第二:linux中命令行默认是行缓冲的,意思就是说当我们程序printf输出的时候,linux不会一个字一个字的输出我们的内容,而是将其缓冲起来放在缓冲区等一行准备完了再一次性把一行全部输出出来(为了效率)。linux判断一行有没有完的依据就是换行符'\n'(windows中换行符是\r\n,linux中是\n。ios中是\r)就是说printf再多,只要没有遇到\n(或者程序终止,或者缓冲区满)都不会输出而会不断缓冲,这时候是看不到内容输出的。因此,在每一个printf打印语句(尤其是用来做调试的printf语句)后面一定要加上\n,否则可能会误判。
第三:
1:关于在linux的交互程序纯粹就是用来学习编程用的,几乎没有实践意义,不用浪费时间去研究
2:scanf是和系统的标准输入打交道,printf是和标准输出打交道。要搞清楚这些东西得把标准输入输出搞清楚。
3:在用户输入内容时结尾都会以\n结尾,但是程序中scanf的时候都不会去接收最后的\n,导致这个回车还存留在标准输入中。下次再次scanf时就会被优先被拿出来,这就导致真正想拿出来的那个反而没有机会拿,导致错误。