一、区别
指针函数:返回指针的函数,即函数的返回类型是指针类型,返回动态分配的内存地址或数组首地址
类型* 函数名(参数列表){
//函数体
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函数的参数:指向函数的入口地址,类型是int
void 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()
{
// 调用指针函数,返回指针sum
p(1, 2);
int num[5] = { 5, 4, 3, 2, 1 };
// 调用sort函数,传入函数指针作为参数
printf("func的地址:%p\n", &func);
return 0;
}

683

被折叠的 条评论
为什么被折叠?



