//可以使用typedef简化一些比较复杂的类型声明,也相当于起别名
#include <stdio.h>
//*************简化数组指针声明***************
typedef int(*PTR_TO_ARRAY)[3]; //PTR_TO_ARRAY为一个数组指针,指向有三个元素的int型数组
//*************简化函数指针声明************
typedef int(*PTR_TO_FUNC)(void);//PTR_TO_FUNC为一个函数指针,指向参数为void,返回类型为int的函数
int func(void)
{
return 1;
}
typedef int* (*PTR_TO_FUNC_)(void);//PTR_TO_FUNC_为一个函数指针,指向参数为void,返回类型为int*的函数
int i=1, j=2, k=3;
int* funcA()
{
printf("i=%d", i);
return &i; //注意,不要返回局部变量的地址
}
int* funcB()
{
printf("j=%d", j);
return &j;
}
int* funcC()
{
printf("k=%d", k);
return &k;
}
//****************一种变态声明:*************************
//void (*funA(int,void (*funB)(int)))(int);
//void (*funB)(int)为函数指针,该指针指向的函数参数为(int),返回值为void是最外面函数的一个参数,
//故可简化为void (*funA(参数)) (int),括号内返回一个指针,故总体也是一个函数指针,即函数指针作为一种参数
//总体的函数指针指向的函数参数为(int),返回值类型为void
//typedef void(*PTR_TO_FUN)(int); //PTR_TO_FUN为一个函数指针类型,指向的函数参数为(int),返回类型为void
//PTR_TO_FUN fun(int, PTR_TO_FUN); //上面的变态声明可简化
//*******************举例:计算表达式(+ 或 —)************
typedef int(*ptr_to_func)(int, int);
int add(int num1, int num2)
{
return num1 + num2;
}
int sub(int num1, int num2)
{
return num1 - num2;
}
//函数指针作为参数
//int calc(int(*fp)(int, int), int num1, int num2) //原来的写法
//{
// return (*fp)(num1, num2);
//}
//使用typedef定义的别名简写
int calc(ptr_to_func fp, int num1, int num2) //ptr_to_func为一个函数指针,指向的函数参数为(int,int),返回类型为int
{
return (*fp)(num1, num2);
}
//函数指针作为返回值
//int(*select(char op))(int, int) //先select(char)是一个函数,再加*表示这个函数返回一个函数指针,该指针指向的函数返回整形并带有两个参数(int,int)
//{
// switch (op)
// {
// case '+':return add;
// case '-':return sub;
// default:
// break;
// }
//}
//使用typedef定义的别名简写:
ptr_to_func select(char op) //返回类型为ptr_to_func函数指针,该函数指针指向的函数参数为(int,int),返回类型为int
{
switch (op)
{
case '+':return add;
case '-':return sub;
default:
break;
}
}
//可以看出发现函数calc的参数函数指针int(*fp) (int,int)是select函数的返回类型,即使用typedef定义的ptr_to_func类型
//******************举例END******************************
int main(int argc, char** argv)
{
//***************简化数组指针*************
int a[3] = { 1,2,3 };
PTR_TO_ARRAY ptr_to_a = &a;
for (int i = 0; i < 3; i++)
{
printf("%d\n", *(*ptr_to_a + i)); //输出数组的值
//1 输出正确
//2
//3
}
//**************简化函数指针****************
PTR_TO_FUNC ptr_to_func = &func;
printf("%d\n", (*ptr_to_func)()); //1 使用函数指针调用函数
PTR_TO_FUNC_ array[3] = { &funcA,&funcB,&funcC }; //定义有三个变量的数组,数组中的元素为函数指针
for (int m = 0; m < 3; m++)
{
printf(" addr of num :%p\n", (*array[m])()); //同过指针数组中的函数指针调用对应的函数
//i=1 addr of num :00C08034
//j = 2 addr of num : 00C08038
//k = 3 addr of num : 00C0803C
}
//************举例计算表达式(+ 或 -)**************
int num1, num2;
char op;
int(*fpp)(int, int); //定义函数指针,该函数指针指向的函数参数为(int,int),返回类型为int
printf("请输入一个式子(如1+3):");
scanf("%d%c%d", &num1, &op, &num2); //visual studio使用scanf时报错的话可采取如下解决办法:https://jingyan.baidu.com/article/49711c616b8a1ffa441b7cdc.html
fpp = select(op); //select函数的返回值类型为函数指针
printf("%d %c %d = %d\n", num1, op, num2, calc(fpp, num1, num2));
system("pause");
return 0;
}
网友评论