1.0 函数指针
1.1 函数指针的定义
函数指针是指向函数的指针变量。它的本质是一个指针变量,该指针指向一个函数。函数指针可以像一般函数一样,用于调用函数、传递参数。
1.2 函数指针的声明
int (*fun)(int x,int y);
或者
int (*fun)(int, int); // 一般用这种
1.3 函数指针的赋值
int max(int x, int y)
{return x > y ? x : y;
}
int (* fun)(int, int) = & max; // &可以省略,取地址运算符&不是必需的,因为一个函数标识符就表示了它的地址。// 或者配合typedef使用
typedef int (*fun_ptr)(int, int); // //等价于 int(*)(int, int) 这个类型用fun_ptr来简短表示
int main() {fun_ptr fp = max; // 将函数max的地址赋值给函数指针fpint result = fp(3, 4); // 通过函数指针调用函数printf("Result: %d\n", result); // 输出结果 4return 0;
}
1.4 函数指针的调用方式
x = (*fun)();
或者
x = fun();
1.5 函数指针的常见用途
函数指针常用于回调函数。函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。
简单讲:回调函数是由别人的函数执行时调用你实现的函数。
以下是来自知乎作者常溪玲的解说:你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。
#include <stdlib.h>
#include <stdio.h>void populate_array(int *array, size_t arraySize, int (*getNextValue)(void))
{for (size_t i=0; i<arraySize; i++)array[i] = getNextValue();
}// 获取随机值
int getNextRandomValue(void)
{return rand();
}int main(void)
{int myarray[10];/* getNextRandomValue 不能加括号,否则无法编译,因为加上括号之后相当于传入此参数时传入了 int , 而不是函数指针*/populate_array(myarray, 10, getNextRandomValue);for(int i = 0; i < 10; i++) {printf("%d ", myarray[i]);}printf("\n");return 0;
}
1.6 函数指针的作为函数返回值的写法
int (*fun(int x, int y))(int, int); // fun函数入参为两个int,返回参数为一个函数指针,该函数指针接受两个int,返回一个int。
2.0 指针函数
指针函数是指返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。写法如下:
int *fun(int x,int y);
int * fun(int x,int y);
int* fun(int x,int y);
3.0 复杂类型定义
右左原则:以变量为中心,先向右解析再向左解析。
3.1 定义⼀个指向指针的指针,它指向的指针是指向⼀个整型数(A pointer to a pointer to an integer)
int **a;
3.2 定义⼀个指向有10个整型数数组的指针(A pointer to an array of 10 integers)
int (*a)[10];
3.3 定义⼀个有10个指针的数组,该指针指向⼀个函数,该函数有⼀个整型参数并返回⼀个整型数( An array of ten pointers to functions that take an integer argument and return an integer )
int (*a[10])(int);
参考
- 【嵌入式八股文面试题合集-嵌入式工程师笔试面试100题 校招社招必备 嵌入式开发/Linux/STM32单片机/C语言/C++/Qt/秋招春招/FreeRTOS】 https://www.bilibili.com/video/BV17n6PY7EYB/?share_source=copy_web&vd_source=e918d05c855265d9b6476ab860322e91
- https://blog.csdn.net/luoyayun361/article/details/80428882
- https://blog.csdn.net/qq_27825451/article/details/103081289
- https://www.runoob.com/cprogramming/c-fun-pointer-callback.html
- 【嵌入式C语言高阶版】 https://www.bilibili.com/video/BV1qCSkY7EyD/?p=72&share_source=copy_web&vd_source=e918d05c855265d9b6476ab860322e91