函数指针与指针函数
2023-12-14 13:33:00
函数指针:
定义
函数指针是指向函数的指针,其本质是一个指针变量,该指针指向这个函数。即指针存储的地址是一个函数的地址,函数指针就是指向函数的指针。
用途
- 函数指针可以作为参数传递给其他函数,用于回调函数(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 code
return 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);可以简单粗暴的理解为,指针函数的是属于数据类型的,而函数指针的星号是属于函数名的。
文章来源:https://blog.csdn.net/weixin_42271802/article/details/134989425
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!