函数指针:
定义
函数指针是指向函数的指针,其本质是一个指针变量,该指针指向这个函数。即指针存储的地址是一个函数的地址,函数指针就是指向函数的指针。
用途
- 函数指针可以作为参数传递给其他函数,用于回调函数(callback)的实现。函数回调本质为函数指针作为函数参数,函数调用时传入函数地址,这使我们的代码变得更加灵活,可复用性更强。
- 用于在运行时选择调用哪个函数。
用途一:回调函数
int (*fun)(int x,int y);
用法
int maxValue (int a, int b) {
return a > b ? a : b;
}
int (*p)(int, int) = NULL; //定义一个与maxValue兼容的指针
p = maxValue;
p(20, 45); //通过指针调用
注意,为什么函数赋值,不是p = &maxValue;
函数指针是需要把一个函数的地址赋值给它,有两种写法:
1. fun = &Function;2. fun = Function;
其中第二种看上去和普通的函数调用没啥区别。
用途二:运行时选择调用哪个函数
举例:
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int main() {
int (*operation)(int, int); // 声明一个函数指针
operation = add; // 指向 add 函数
printf("%d\n", operation(5, 3));
operation = subtract; // 指向 subtract 函数
printf("%d\n", operation(5, 3));return 0;}
等式关系
int (*p)(int,int) 实际上等价于 int (*)(int,int) p
说明:
- 在 C 语言中,声明函数指针的时候,括号的位置可以调整,不影响其含义。这两种声明方式都表达了同样的含义:p是一个指向函数的指针,该函数接受两个整数参数并返回一个整数。
函数指针定义理解一
int *(*Pointer)(int,int);
说明:
这个可以理解为 Pointer 是一个指向函数的指针,而该函数接受两个整数参数并返回一个指向整数的指针。
具体解释如下:
- Pointer:表示这是一个指针。
- (*Pointer):表示这是一个指向的指针。
- int *(Pointer):表示这是一个指向返回类型为 int 的指针的指针。
- int *(Pointer)(int, int):表示这是一个指向接受两个整数参数并返回 int 类型的指针的函数的指针。
所以,如果使用 Pointer 调用函数,该函数应该是这样的:
int* myFunction(int a, int b) {
// some code
return someIntPtr;
}
// 声明一个指向函数的指针
int *(*Pointer)(int, int);
// 使用指针调用函数
int* result = Pointer(3, 5);
上述代码中,Pointer 指向一个函数,该函数接受两个整数参数,并返回一个指向整数的指针。
函数指针定义理解二
typedef int *(*Pointer)(int,int);
这个语句定义了一个函数指针类型,这个类型名字是 Pointer。这个函数指针类型指向一个函数,该函数接受两个整数参数,返回一个指向整数的指针。
具体解释如下:
- typedef:这是一个关键字,用于定义新的类型别名。
- int *(*Pointer)(int, int);:这是一个函数指针的声明,表示 Pointer 是一个指向函数的指针,该函数接受两个整数参数并返回一个指向整数的指针。
- typedef int *(*Pointer)(int, int);:将上述的函数指针声明定义为一个新的类型别名 Pointer。
这样一来,你就可以在代码中使用 Pointer 作为类型名字,而不必每次都写出完整的函数指针声明。
typedef int *(*Pointer)(int, int);// 使用 Pointer 定义函数指针变量
Pointer myFunctionPointer;// 使用 Pointer 声明函数
int* myFunction(int a, int b) {// some codereturn someIntPtr;
}// 使用函数指针变量调用函数
int* result = myFunctionPointer(3, 5);
这种方式使得代码更加清晰,特别是当你需要定义多个相同类型的函数指针时。
指针函数
定义
- 指针函数是一个返回指针的函数,即函数返回的是一个指针。当然,函数本身也可能返回一个函数指针。
用途
- 指针函数通常用于动态分配内存、返回动态分配的数组等场景。
代码说明:
#include <stdio.h>
#include <stdlib.h>
int* createArray(int size) {
int* arr = (int*)malloc(size * sizeof(int));
return arr;
}
int main() {
int* myArray = createArray(5);
// 使用 myArray
free(myArray); // 记得释放内存
return 0;
}
指针函数内返回的是函数指针怎么理解
#include <stdio.h>// 定义一个简单的函数,该函数接受两个整数,返回它们的和
int add(int a, int b) {return a + b;
}// 定义一个指针函数,该函数接受一个整数作为参数,返回一个指向函数的指针
int (*getAddFunctionPointer(int value))(int, int) {if (value > 0) {// 如果传入的值是正数,返回指向 add 函数的指针return add;} else {// 如果传入的值是非正数,返回空指针return NULL;}
}int main() {// 调用指针函数,传入正数,得到一个指向 add 函数的指针int (*functionPointer)(int, int) = getAddFunctionPointer(1);if (functionPointer != NULL) {// 使用函数指针调用函数int result = functionPointer(3, 4);printf("Result: %d\n", result);} else {printf("Function pointer is NULL.\n");}return 0;
}
二者区别
定义不同
- 指针函数本质是一个函数,其返回值为指针。
- 函数指针本质是一个指针,其指向一个函数。
写法不同
- 指针函数:int* fun(int x,int y);
- 函数指针:int (fun)(int x,int y);可以简单粗暴的理解为,指针函数的是属于数据类型的,而函数指针的星号是属于函数名的。