指针函数和函数指针

最主要区别:指针函数是函数,只不过最后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;
}
相关推荐
恶魔泡泡糖5 小时前
51单片机矩阵按键
c语言·算法·矩阵·51单片机
松涛和鸣6 小时前
DAY52 7-Segment Display/GPIO/Buttons/Interrupts/Timers/PWM
c语言·数据库·单片机·sqlite·html
Echo缘6 小时前
关于在.cpp文件中包含c的头文件,编译报错问题
c语言·开发语言
我是海飞6 小时前
杰理 AC792N WebSocket 客户端例程使用测试教程
c语言·python·单片机·websocket·网络协议·嵌入式·杰理
项目題供诗7 小时前
C语言基础(三)
c语言·c++
码农水水7 小时前
中国电网Java面试被问:流批一体架构的实现和状态管理
java·c语言·开发语言·面试·职场和发展·架构·kafka
宵时待雨8 小时前
数据结构(初阶)笔记归纳2:顺序表的实现
c语言·数据结构·笔记·算法
小鱼23338 小时前
STM32中的中断机制与应用
c语言·stm32·单片机·嵌入式硬件·mcu
阿华hhh9 小时前
单片机day1
c语言·单片机·嵌入式硬件
我还可以再学点9 小时前
C语言常见函数
c语言·开发语言