指针函数和函数指针

最主要区别:指针函数是函数,只不过最后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;
}
相关推荐
a4493153629 小时前
MacBook USB-C不充电故障诊断:从PD握手到主板供电链路
c语言·开发语言·macos·电脑
qq_4480111610 小时前
C语言中的getchar()
c语言·开发语言
天空'之城10 小时前
C 语言工业级通用组件手写 15:累加和校验
c语言·嵌入式开发·工业级组件·累加和校验
碎光拾影1 天前
i.MX6ULL时钟系统配置指南
c语言·arm开发·嵌入式硬件
GeekArch1 天前
第28讲:避坑——AI堆栈分配错误、栈溢出BUG
c语言·人工智能·stm32·mcu·学习·bug
wuyk5551 天前
59.嵌入式C语言高级宏定义实战:多行宏、字符串化与符号拼接
c语言·开发语言·stm32·单片机·嵌入式硬件·物联网·51单片机
无相求码1 天前
C程序的内存到底怎么分的?栈、堆、全局区一张图讲清楚
c语言
天空'之城1 天前
C 语言工业级通用组件手写 08:精准软件消抖
c语言·嵌入式开发·工业级组件·软件消抖·按键防抖
Legendary_0081 天前
LDR6500 设计指南:Type-C 音频快充二合一配件 PD 取电与插拔时序控制方案
c语言·开发语言·音视频
会飞的小新1 天前
C 标准库之 <fenv.h> 详解与深度解析
c语言·开发语言·microsoft