函数指针与指针函数

2023-12-14 13:33:00

函数指针:

定义
函数指针是指向函数的指针,其本质是一个指针变量,该指针指向这个函数。即指针存储的地址是一个函数的地址,函数指针就是指向函数的指针。

用途

  1. 函数指针可以作为参数传递给其他函数,用于回调函数(callback)的实现。函数回调本质为函数指针作为函数参数,函数调用时传入函数地址,这使我们的代码变得更加灵活,可复用性更强。
  2. 用于在运行时选择调用哪个函数。

用途一:回调函数

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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。