旅游网站开发参考文献,开发购物网站社交的软件公司,wordpress 汉化,怎么自己建立一个网站后台一、函数指针变量
1.1 函数指针变量的创建
什么是函数指针变量呢#xff1f;
函数指针变量应该是用来存放函数地址的#xff0c;未来通过地址能够调⽤函数的。 那么函数是否有地址呢#xff1f;
我们做个测试#xff1a;
#include stdio.h
void test()
{print…一、函数指针变量
1.1 函数指针变量的创建
什么是函数指针变量呢
函数指针变量应该是用来存放函数地址的未来通过地址能够调⽤函数的。 那么函数是否有地址呢
我们做个测试
#include stdio.h
void test()
{printf(hehe\n);
}
int main()
{printf(test: %p\n, test);printf(test: %p\n, test);return 0;
}
结果如下 确实打印出来了地址所以函数是有地址的函数名就是函数的地址当然也可以通过函数名的方式获得函数的地址。
如果我们要将函数的地址存放起来就得创建函数指针变量咯函数指针变量的写法其实和数组指针非常类似。如下
void test()
{printf(hehe\n);
}
void (*pf1)() test;
void (*pf2)() test;
int Add(int x, int y)
{return x y;
}
int(*pf3)(int, int) Add;
int(*pf3)(int x, int y) Add;//x和y写上或者省略都是可以的
函数指针类型解析
int (*pf3) (int x, int y)
| | ------------
| | |
| | pf3指向函数的参数类型和个数的交代
| 函数指针变量名
pf3指向函数的返回类型
int (*) (int x, int y) //pf3函数指针变量的类型
1.2 函数指针变量的使用
通过函数指针调用指针指向的函数。
#include stdio.h
int Add(int x, int y)
{return x y;
}
int main()
{int(*pf3)(int, int) Add;printf(%d\n, (*pf3)(2, 3));printf(%d\n, pf3(3, 5));return 0;
}
输出结果 我们这里可以看出针对与函数指针变量对于对函数指针变量进行解引用操作和不进行解引用操作都可以调用Add函数并使用所以对于函数指针变量的使用解引用操作符可以不写。
1.3 typedef关键字
typedef 是用来类型重命名的可以将复杂的类型简单化。
比如你觉得 unsigned int 写起来不方便如果能写成 uint 就⽅便多了那么我们可以使用
typedef unsigned int uint;
//将unsigned int 重命名为uint
如果是指针类型能否重命名呢其实也是可以的比如将 int* 重命名为 ptr_t ,这样写
typedef int* ptr_t;但是对于数组指针和函数指针稍微有点区别 ⽐如我们有数组指针类型 int(*)[5] ,需要重命名为 parr_t 那可以这样写
typedef int(*parr_t)[5]; //新的类型名必须在*的右边
函数指针类型的重命名也是⼀样的⽐如将 void(*)(int) 类型重命名为 pf_t ,就可以这样写
typedef void(*pfun_t)(int);//新的类型名必须在*的右边
void (*signal(int , void(*)(int)))(int);
//简化后
typedef void(*pfun_t)(int);
pfun_t signal(int, pfun_t);
二、函数指针数组
数组是⼀个存放相同类型数据的存储空间我们已经学习了指针数组
比如
int *arr[10];
//数组的每个元素是int*那要把函数的地址存到⼀个数组中那这个数组就叫函数指针数组那函数指针的数组如何定义呢
int (*parr1[3])();
int *parr2[3]();
int (*)() parr3[3];答案是parr1
parr1 先和 [ ] 结合说明 parr1是数组数组的内容是什么呢
是 int (*)() 类型的函数指针。