mirror of
https://github.com/Aexiar/c.git
synced 2024-10-22 14:05:45 +02:00
2024年10月8日 13:50
This commit is contained in:
parent
939f665ac1
commit
9cc7eae090
@ -1263,9 +1263,102 @@ int main(){
|
||||
|
||||
## 2.4 函数指针(指向函数的指针)
|
||||
|
||||
### 2.4.1 概述
|
||||
|
||||
* 一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。
|
||||
* 我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数,这种指针就是函数指针。
|
||||
* 函数指针声明语法:
|
||||
|
||||
```c
|
||||
返回值类型 (*指针变量名)(参数列表);
|
||||
```
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - ① 简单来说,函数指针,就是指向函数的指针。
|
||||
> - ② 参数列表中可以同时给出参数的类型和名称,也可以只给出参数的类型,省略参数的名称。
|
||||
> - ③ 不可以省略 `()` ,如果写成 `返回值类型 *指针变量名(参数列表);`,就变为了函数原型,而不再是函数指针。
|
||||
|
||||
* 函数指针调用语法:
|
||||
|
||||
```c
|
||||
(*指针变量)(实参列表);
|
||||
```
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> - ① C 语言规定,`函数名`本身就是指向函数的指针,通过`函数名`可以获取函数地址。
|
||||
> - ② 对指向函数的指针变量不能进行算术运算,如:p+n,p++,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 回调函数
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user