函数指针和指针函数的核心区别

一、区别

指针函数:返回指针的函数,即函数的返回类型是指针类型,返回动态分配的内存地址或数组首地址

类型* 函数名(参数列表){
    //函数体
    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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值