- 函数指针
- 代码示例
- 函数指针数组
- 示例:计算器
- 指向函数指针数组的指针
//数组指针
int arr[10];
int(*p)[10] = &arr;
//函数指针
int Add(int x, int y);
int(*pf)(int, int) = &Add;
//int(*pf)(int, int) = Add;//该代码与上面的代码意义相同,即函数名就可以代表函数的地址
代码示例( *( void (*)() ) 0 )();
0先与 (void(* )()) 结合,也就是说0先被强制类型转换为 void(* )() 的函数指针,然后又被解引用(* (void(* )())0) 就相当于使用在0地址处的类型为void(*)()的一个函数,而后面的那个括号本来就没有参数。
void (*signal(int, void(*)(int)))(int);
signal是变量名,signal先与后面的括号结合,表明signal是一个函数,括号内的内容表明该函数第一个参数的参数类型是int,第二个参数的参数类型是void(* )(int),该代码去掉signal(int, void(* )(int)),剩下的内容是void(*)(int),这部分内容是signal函数的返回类型。
//typedef unusigned int u_int
typedef void(*pf)(int);
pf signal(int, pf);
使用typedef将void(*)(int) 重定义为pf, 然后再用pf表示signal函数更加容易理解(注意重命名时的书写)
函数指针数组存放函数指针的数组就是函数指针数组
//指针
int* p = NULL;
//指针数组
int* arr[5];
//函数指针
int(*pf)(int, int);
//函数指针数组
int(*pf[5])(int, int);
int(* pf[5])(int, int)中pf先与[]结合表明pf是一个数组,去掉pf[5]后的内容是该数组中的元素类型int(* )(int, int),也就是说该数组中存放的有5个类型为int(* )(int, int)的函数指针。
示例:计算器#includevoid menu();
int Add(int, int);
int Sub(int, int);
int Mul(int, int);
int Div(int, int);
int main()
{int x = 0;
int y = 0;
int ret = 0;
int input = 0;
int(*pf[5])(int, int) = {NULL, Add, Sub, Mul, Div};
do
{menu();
scanf("%d", &input);
if (input<= 4 && input >= 1)
{ printf("Enter two numbers: ");
scanf("%d%d", &x, &y);
ret = pf[input](x, y);
printf("%d\n", ret);
}
else if (0 == input)
{ printf("退出程序\n");
}
else
{ printf("输入错误\n");
}
} while (input);
return 0;
}
int Add(int a, int b)
{return a + b;
}
int Sub(int a, int b)
{return a - b;
}
int Mul(int a, int b)
{return a * b;
}
int Div(int a, int b)
{return a / b;
}
void menu()
{printf("\n1.add 2.sub\n");
printf("\n3.mul 4.div\n");
printf("\n 0.exit\n");
}
该程序中的函数指针数组将调用的函数都存放到一个数组中,在使用的时候可以直接使用不同的下标来访问不同的函数。
指向函数指针数组的指针指向函数指针数组的指针是一个指针,它指向了一个数组,该数组是函数指针数组。
//函数指针
int(*p)(int, int);
//函数指针数组
int(*pf[5])(int, int);
//指向函数指针数组的指针
int(*(*pff)[5])(int, int);
pff 先与 * 结合,表明 pff 是一个指针,去掉 ( * pff ) 之后,剩下的就是 pff 指向的类型,也就是 int( * [5])(int, int)。因为 pff 可以理解为对函数指针数组取地址,也就是 pff = &pf, * pff也就应该等价于 pf ,所以可以直接在函数指针数组 pf 的基础上得到指向函数指针数组的指针,也就是将 pf 直接改为 * pff ,再在 * pff 的外面加上括号。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网站名称:C语言函数指针-创新互联
网址分享:http://lswzjz.com/article/ddhhse.html