指针函数和函数指针

最主要区别:指针函数是函数,只不过最后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;
}
相关推荐
水饺编程19 小时前
第4章,[标签 Win32] :文本尺寸的度量
c语言·c++·windows·visual studio
浅念-19 小时前
C语言——自定义类型:结构体、联合体、枚举
c语言·开发语言·数据结构·c++·笔记·学习·html
mirror_zAI19 小时前
C语言中的sscanf用法详解
c语言·开发语言
bin915319 小时前
C盘瘦身大作战:程序员的存储空间优化全攻略
c语言·开发语言·c盘清理·c盘清理技巧分享
小龙报20 小时前
【数据结构与算法】单链表核心精讲:从概念到实战,吃透指针与动态内存操作
c语言·开发语言·数据结构·c++·人工智能·算法·链表
蒸蒸yyyyzwd20 小时前
stl源码剖析迭代器学习笔记
c语言·c++
_F_y1 天前
MySQL用C/C++连接
c语言·c++·mysql
BackCatK Chen1 天前
C语言学习栏目目录
c语言·保姆级教程·c语言入门·c语言学习栏目目录
极客数模1 天前
【2026美赛赛题初步翻译F题】2026_ICM_Problem_F
大数据·c语言·python·数学建模·matlab
请注意这个女生叫小美1 天前
C语言 斐波那契而数列
c语言