概念:本质上是函数,函数的返回值是地址
- 1、定义格式:
- 存储类型 数据类型 *函数名(形参)
- {
- 函数体;
- return 地址;
- }
- 局部变量 --> 栈区、自动开辟自动释放
- 生命周期:函数调用结束空间释放
- 作用域:函数体内,定义未初始化值为随机值。
- 全局变量 --> 静态区(.bss-定义值0 .data-定义的同时初始化),
- 生命周期:程序结束空间释放,
- 作用域:整个文件,定义未初始化值为0。
- 堆区 ----->程序员使用时开辟,用完需要手动释放
- malloc:手动开辟堆区空间函数
- #include <stdlib.h>
- void *malloc(size_t size);
- 功能:在堆区开辟空间
- 参数:size:开辟空间的字节大小
- 返回值:成功 -->开辟空间的首地址
- 失败 -->NULL
- free:手动释放堆区空间
- void free(void *ptr) //手动释放堆区空间
- 功能:释放堆区空间
- 参数:ptr:要释放空间的首地址
- 返回值:无



本质:本质上是指针是指向一个函数的指针。
函数名就是函数的首地址。
- 1、定义格式
- 存储类型 数据类型 (*函数指针变量名)(形参列表)
- int add(int a,int b)
- {
- return a+b;
- }
- int sub(int c,int d)
- {
- return a-b;
- }
- 定义指针指向这个函数:
- int (*p)(int,int);
- p = add;// 相当于用 p代替add访问函数,指针调用函数
- 2、通过函数指针调用函数
- 函数指针变量名(参数)-->指针代替函数名去调用函数
- (*函数指针变量名)(实参)-->不常用
用法:
当一个函数指针指向一个函数,就可以通过这个指针来调用该函数
- int add(int a, int b)
- {
- return a + b;
- }
- int sub(int c, int d)
- {
- return c - d;
- }
-
-
- int main(int argc, char const *argv[])
- {
- int (*p)(int, int) = add;
- printf("%d\n", p(1, 2));
- return 0;
- }

函数指针可以将函数作为参数传递给其他的函数调用

举例:
- 1、char *fun(int a,short *b);
- 定义一个函数指针来指向这个函数:
- char *(*p1)(int,short *)=fun;
- 2、void fun1(char *sp,int **st,int n)
- 定义一个函数指针来指向这个函数:
- void (*p2)(char *,int **,int)=fun1;
- 3、void *fun2(int (*sp)[3],int m);
- 定义一个函数指针来指向这个函数:
- void *(*p3)(int (*)[3],int)=fun2;
本质是数组,元素是同类型的函数指针
存储类型 数据类型 (*函数指针数组名[元素个数])(形参列表)
- #include
-
- int add(int a, int b)
- {
- return a + b;
- }
- int sub(int a, int b)
- {
- return a - b;
- }
- int sul(int a, int b)
- {
- return a * b;
- }
- int less(int a, int b)
- {
- return a % b;
- }
-
- int main(int argc, char const *argv[])
- {
- int (*sp[4])(int, int) = {add, sub, sul, less}; // 函数指针数组的声明
- int ret = sp[1](1, 3); // 函数的调用
- printf("%d\n", ret);
- return 0;
- }
-
