函数指针和指针函数的核心区别
一、区别
指针函数:返回指针的函数,即函数的返回类型是指针类型,返回动态分配的内存地址或数组首地址
类型* 函数名(参数列表){//函数体return 指针;
}
函数指针:本质是指针变量,存储函数的入口地址,用于间接调用函数。
返回值类型 (*指针变量名)(参数类型列表);
核心区别对比:
特性 | 指针函数 | 函数指针 |
本质 | 函数(返回值为指针) | 指针(指向函数入口地址) |
声明语法 | int* func(int a); | int (*func)(int a); |
典型用途 | 动态内存分配、返回数组/结构体地址 | 回调机制、策略模式、动态选择函数行为 |
调用方式 | 直接调用:int* arr = func(5); | 通过指针调用:int result = funcPtr(3,5); |
内存管理 | 需由调用者释放返回的指针 | 不涉及内存分配,仅指向已有函数 |
语法优先级 | * 与返回类型结合(如int*) | (*指针名) 表示指针定义 |
核心区别:指针函数是函数,函数指针是变量;前者生成数据地址,后者存储代码地址/指向的是可执行代码而非数据。
二、代码示例
#include <stdio.h>
#include <stdlib.h>// 指针函数定义
int* p(int a, int b) {int* sum = (int*)malloc(sizeof(int)); //局部变量,函数结束后释放if (sum == NULL) {printf("内存分配失败");exit(1);}else {printf("内存分配成功");*sum = a + b;printf("sum = %d\n", *sum);}printf("指针sum的值:%p\n", sum);return sum;
}// 定义函数指针作为sort函数的参数:指向函数的入口地址,类型是intvoid sort(int arr[], int size, int (*compare)(int, int)) {for (int i = 0; i < size - 1; i++) {for (int j = 0; j < size - i - 1; j++) {if (compare(arr[j], arr[j + 1]) > 0) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}// 函数指针调用:函数指针必须与目标函数原型(参数类型、返回类型)完全一致,否则行为未定义
int (*func)(int a, int b); // func是函数指针变量int main()
{// 调用指针函数,返回指针sump(1, 2);int num[5] = { 5, 4, 3, 2, 1 };// 调用sort函数,传入函数指针作为参数printf("func的地址:%p\n", &func);return 0;
}