指针函数和函数指针

最主要区别:指针函数是函数,只不过最后retrurn返回的是指针,

函数指针是指针,指针指向函数,可用于回调函数

函数指针(Function Pointer)

1.基本函数指针

声明函数指针,然后指向即可

复制代码
#include<stdio.h>

int add(int a, int b)
{
    return a + b;
}

int subtract(int a, int b)
{
    return a - b;
}

int multiply(int a, int b)
{
    return a * b;
}

int main()
{
    //定义 指针函数
    int (*function)(int, int);
    
    //指向add函数
    function = add;
    printf("10 + 5 = %d\n", operation(10, 5));

    // 指向subtract函数
    function = subtract;
    printf("10 - 5 = %d\n", operation(10, 5));

    // 指向multiply函数
    function = multiply;
    printf("10 * 5 = %d\n", operation(10, 5));
    
    return 0;
}

2.函数指针作为参数(回调函数)

复制代码
#include <stdio.h>

// 回调函数类型
typedef void (*Callback)(int); //返回值 void 函数名 Callback 参数int

// 数据处理函数,接受回调函数作为参数
void process_data(int data[], int size, Callback callback) {
    printf("处理数据: ");
    for (int i = 0; i < size; i++) {
        callback(data[i]);  // 调用回调函数
    }
    printf("\n");
}

// 不同的回调函数
void print_number(int num) {
    printf("%d ", num);
}

void print_square(int num) {
    printf("%d ", num * num);
}

void print_hex(int num) {
    printf("0x%x ", num);
}

int main() {
    int numbers[] = {1, 2, 3, 4, 5};
    int size = sizeof(numbers) / sizeof(numbers[0]);

    printf("=== 函数指针作为回调函数 ===\n");

    printf("1. 打印原始数据: ");
    process_data(numbers, size, print_number);

    printf("2. 打印平方数: ");
    process_data(numbers, size, print_square);

    printf("3. 打印十六进制: ");
    process_data(numbers, size, print_hex);

    return 0;

指针函数(Pointer Function)

1.返回字符串指针

类型 *函数名(参数列表)

复制代码
#include <stdio.h>
#include <string.h>

// 指针函数:返回char指针
char *get_greeting(int hour) {
    if (hour < 12) {
        return "Good morning";  // 返回字符串常量的指针
    } else if (hour < 18) {
        return "Good afternoon";
    } else {
        return "Good evening";
    }
}

int main() {
    int time = 14;
    char *greeting = get_greeting(time);  // 接收返回的指针
    
    printf("时间: %d:00\n", time);
    printf("问候语: %s\n", greeting);
    
    // 直接使用
    printf("%s, Alice!\n", get_greeting(9));
    printf("%s, Bob!\n", get_greeting(20));
    
    return 0;
}

2.返回动态分配内存的指针

malloc + free

复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 指针函数:返回动态分配内存的指针
char *create_full_name(const char *first, const char *last) {
    // 动态分配内存
    int length = strlen(first) + strlen(last) + 2;  // +2: 空格和\0
    char *full_name = (char *)malloc(length * sizeof(char));
    
    if (full_name != NULL) {
        strcpy(full_name, first);
        strcat(full_name, " ");
        strcat(full_name, last);
    }
    
    return full_name;  // 返回指针
}

int main() {
    char *name1 = create_full_name("张", "三");
    char *name2 = create_full_name("Li", "Si");
    
    if (name1 && name2) {
        printf("姓名1: %s\n", name1);
        printf("姓名2: %s\n", name2);
    }
    
    // 必须释放动态分配的内存
    free(name1);
    free(name2);
    
    return 0;
}
相关推荐
2601_949146536 小时前
C语言语音通知接口接入教程:如何使用C语言直接调用语音预警API
c语言·开发语言
知南x8 小时前
【Ascend C系列课程(高级)】(1) 算子调试+调优
c语言·开发语言
2的n次方_10 小时前
Runtime 执行提交机制:NPU 硬件队列的管理与任务原子化下发
c语言·开发语言
凡人叶枫10 小时前
C++中智能指针详解(Linux实战版)| 彻底解决内存泄漏,新手也能吃透
java·linux·c语言·开发语言·c++·嵌入式开发
凡人叶枫12 小时前
C++中输入、输出和文件操作详解(Linux实战版)| 从基础到项目落地,避坑指南
linux·服务器·c语言·开发语言·c++
傻乐u兔13 小时前
C语言进阶————指针3
c语言·开发语言
CodeSheep程序羊14 小时前
拼多多春节加班工资曝光,没几个敢给这个数的。
java·c语言·开发语言·c++·python·程序人生·职场和发展
I'mChloe14 小时前
PTO-ISA 深度解析:PyPTO 范式生成的底层指令集与 NPU 算子执行的硬件映射
c语言·开发语言
2的n次方_15 小时前
Runtime 内存管理深化:推理批处理下的内存复用与生命周期精细控制
c语言·网络·架构
嵌入小生00715 小时前
标准IO---核心函数接口延续(嵌入式Linux)
c语言·vscode·vim·嵌入式·小白·标准io·函数接口