指针函数和函数指针

最主要区别:指针函数是函数,只不过最后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;
}
相关推荐
cmpxr_2 小时前
【C】数组名、函数名的特殊
c语言·算法
itman3013 小时前
C语言怎么学?从写程序到玩指针的实操攻略
c语言·指针·结构体·编程学习·资源推荐
kang_jin5 小时前
C语言结构体入门:stu定义与成员使用
c语言·教程·编程语言·入门·结构体
独小乐5 小时前
012.整体框架适配SDRAM|千篇笔记实现嵌入式全栈/裸机篇
c语言·汇编·笔记·单片机·嵌入式硬件·arm·gnu
li1670902708 小时前
第十章:list
c语言·开发语言·数据结构·c++·算法·list·visual studio
笨笨饿8 小时前
# 52_浅谈为什么工程基本进入复数域?
linux·服务器·c语言·数据结构·人工智能·算法·学习方法
Shadow(⊙o⊙)8 小时前
static与extern使用
c语言·学习
范纹杉想快点毕业9 小时前
Zynq开发视角下的C语言能力分级详解
c语言·开发语言
橘子编程10 小时前
GoF 23 种设计模式完整知识总结与使用教程
java·c语言·开发语言·python·设计模式
意疏10 小时前
【C语言】解决VScode中文乱码问题
c语言·开发语言·vscode