2024年10月8日 13:50

This commit is contained in:
许大仙 2024-10-08 05:50:34 +00:00
parent 939f665ac1
commit 9cc7eae090

View File

@ -1263,9 +1263,102 @@ int main(){
## 2.4 函数指针(指向函数的指针)
### 2.4.1 概述
* 一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。
* 我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数,这种指针就是函数指针。
* 函数指针声明语法:
```c
返回值类型 (*指针变量名)(参数列表);
```
> [!CAUTION]
>
> - ① 简单来说,函数指针,就是指向函数的指针。
> - ② 参数列表中可以同时给出参数的类型和名称,也可以只给出参数的类型,省略参数的名称。
> - ③ 不可以省略 `()` ,如果写成 `返回值类型 *指针变量名(参数列表);`,就变为了函数原型,而不再是函数指针。
* 函数指针调用语法:
```c
(*指针变量)(实参列表);
```
> [!CAUTION]
>
> - ① C 语言规定,`函数名`本身就是指向函数的指针,通过`函数名`可以获取函数地址。
> - ② 对指向函数的指针变量不能进行算术运算p+np++p-- 等运算是无意义的。
> - ③ 用函数名调用函数,只能调用所指定的一个函数,而通过指针变量调用函数比较灵活,可以根据不同情况先后调用不同的函数。
### 2.4.2 应用示例
* 需求:使用函数指针调用方式来调用函数。
* 示例:
```c
#include <stdio.h>
void print(int n) {
printf("%d\n", n);
}
int main() {
// 声明函数指针(变量)
void (*p)(int);
// 将函数赋值给函数指针
p = &print;
int num = 10;
// 普通函数调用方式来调用函数
print(num);
// 函数指针调用方式来调用函数
(*p)(num);
return 0;
}
```
### 2.4.3 应用示例
* 需求:使用函数指针调用方式来调用函数。
* 示例:
```c
#include <stdio.h>
int max(int a, int b) {
return a > b ? a : b;
}
int main() {
// 声明函数指针(变量)并赋值
int (*p)(int, int) = max;
int a = 10;
int b = 20;
// 普通函数调用方式来调用函数
int maxValue = max(a, b);
printf("%d 和 %d 中的最大值是 %d\n", a, b, maxValue);
// 函数指针调用方式来调用函数
maxValue = (*p)(a, b);
printf("%d 和 %d 中的最大值是 %d\n", a, b, maxValue);
return 0;
}
```
## 2.5 回调函数