首页 > 其他分享 >C语言函数指针实用总结——高阶篇

C语言函数指针实用总结——高阶篇

时间:2024-12-21 09:58:14浏览次数:6  
标签:return int void C语言 func 函数指针 高阶 array

4ed939cadcba57788f002e77418e03e4.jpeg

 

在C语言的江湖中,函数指针犹如一门深不可测的绝学,掌握它,你将能够游刃有余地处理各种复杂场景。今天,我们将深入探讨函数指针的高级用法,并通过一系列案例,让你领略其无限魅力。本文为高阶篇,适合已经有一定函数指针基础的读者。

一、函数指针深度解析

1. 函数指针数组与指向函数指针数组的指针

在C语言中,不仅可以使用数组存储函数指针,还可以有指向这些数组的指针。

函数指针数组

int (*func_array[10])(int);

指向函数指针数组的指针

int (*(*func_array_ptr)[10])(int);

2. 函数指针作为返回类型

函数可以返回指针,同样地,函数也可以返回函数指针。

int (*func_factory(int param))(int) {
    // 根据param返回不同的函数指针
    if (param > 0) {
        return &positive_func;
    } else {
        return &negative_func;
    }
}

3. 函数指针与qsort

qsort函数是C标准库中的一个排序函数,它使用函数指针来确定元素间的比较规则。

int compare(const void *a, const void *b) {
    // 比较逻辑
}

qsort(array, number_of_elements, size_of_elements, compare);

4. 函数指针与信号处理

在Unix-like系统中,可以使用signal函数为特定信号设置处理函数。

signal(SIGINT, handle_sigint);

二、高阶函数指针应用案例

案例1:函数指针数组实现多态

#include <stdio.h>

typedef void (*func_ptr_t)(void);

void func1(void) {
    printf("Function 1\n");
}

void func2(void) {
    printf("Function 2\n");
}

int main() {
    func_ptr_t func_array[2] = {func1, func2};
    for (int i = 0; i < 2; i++) {
        func_array[i](); // 调用不同的函数
    }
    return 0;
}

案例2:函数指针作为返回类型实现工厂模式

#include <stdio.h>

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

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

int (*get_operation(char op))(int, int) {
    switch (op) {
        case '+': return add;
        case '-': return subtract;
        default: return NULL;
    }
}

int main() {
    int (*operation)(int, int) = get_operation('+');
    if (operation) {
        printf("Result: %d\n", operation(5, 3));
    }
    return 0;
}

案例3:使用函数指针和qsort进行自定义排序

#include <stdio.h>
#include <stdlib.h>

int compare_ints(const void *a, const void *b) {
    int arg1 = *(const int *)a;
    int arg2 = *(const int *)b;
    return (arg1 > arg2) - (arg1 < arg2);
}

int main() {
    int array[] = {3, 1, 4, 1, 5, 9};
    int size = sizeof(array) / sizeof(array[0]);
    qsort(array, size, sizeof(int), compare_ints);
    for (int i = 0; i < size; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");
    return 0;
}

案例4:使用函数指针处理信号

#include <stdio.h>
#include <signal.h>

void handle_sigint(int sig) {
    printf("Caught signal %d\n", sig);
}

int main() {
    signal(SIGINT, handle_sigint);
    printf("Press Ctrl+C to generate a signal\n");
    while (1) {
        // 等待信号
    }
    return 0;
}

三、总结

函数指针在C语言中的应用广泛且深远,它不仅让函数调用变得灵活,还为实现多态、工厂模式、自定义排序、信号处理等高级功能提供了可能。通过本文的解析和案例,我们深入探讨了函数指针的高级玩法,希望你在实际编程中能够灵活运用这些技巧,让你的代码更加高效、优雅。

 

标签:return,int,void,C语言,func,函数指针,高阶,array
From: https://blog.csdn.net/suifengme/article/details/140893922

相关文章

  • C语言中的宏定义:无参宏与带参宏的详细解析
    C语言中的宏定义:无参宏与带参宏的详细解析在C语言中,宏定义是一种非常强大的预处理功能,通过#define指令可以定义一些常量或者代码片段,用来减少代码重复,提高可读性。本文将详细讲解无参宏与带参宏的使用方法,并通过具体案例分析它们的作用及注意事项。一、无参宏定义无参宏......
  • C语言 排序
    时间:2024.12.18一、冒泡排序(BubbleSort)原理比较相邻的元素。如果第一个比第二个大,就交换它们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的......
  • C#调用c语言dll,并且传入byte数组或字符串,简单实例
    前言在C#中调用dll,可能会出现程序一开始可以运行,但过一会儿后出现内存错误——尝试读取或写入受保护的内存。这通常指示其他内存已损坏。这是由于C#的托管内存机制,而C语言中是非托管内存。如果参数传入dll后,C#提前回收了内存或者移动了数据,将会出现错误。解决方法是,在C#传入dll......
  • C语言的头文件包含,竟存在这么多知识点!
    文章来自:https://zhuanlan.zhihu.com/p/472808057很多事不深入以为自己懂了,但真正用到项目上,才会发现其中的问题。曾以为自己写C语言已经轻车熟路了,特别是对软件文件的工程管理上,因为心里对自己的代码编写风格还是有自信的。本人曾经认为,一个.c文件对应一个.h文件,.c文件只包含......
  • C语言函数
    函数(function)可以翻译为子程序;函数就是一个完成某项特定任务的代码库函数:C语言规定了语法(功能,名字,参数,返回值),C语言不规定库函数,ANSIC规定了一些函数的标准,叫做标准库。标准库里的函数叫做库函数,printf,scanf都是库函数。if,switch,for等等,数组,函数打印:printf输入:scanf求......
  • 操作系统-存储管理-C语言
    一、实验内容        主存储器空间的分配和回收。二、实验目的        一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一......
  • C语言习题~day11
    1、C程序常见的错误分类不包含:()A.编译错误B.链接错误C.栈溢出D.运行时错误栈溢出是运行时错误的一种,因此C程序不会将栈溢出错误单独列出来,栈溢出包含在运行时错误中。因此:选择C2、关于VS调试快捷键说法错误的是:()A.F5-是开始执行,不调试B.F10-是逐过程调试,遇到函数不......
  • C语言 qsort 详解
    qsort1.定义:           qsort,基于快速排序(QuickSort)算法的一个库函数,可以将一串整型类型、浮点类型、       字符串类型、结构体类型等的数据进行排序。比冒泡排序,选择法排序好用,且速度更快。2.语法:        具体语法如下:qsort(arr,siz......
  • 什么是c语言
    _//by:符映维2024-12-19_分类内容C语言简介C语言是一种中级编程语言,最初由DennisM.Ritchie在贝尔实验室为Unix操作系统开发。它结合了高级语言的特点和低级语言的特性,允许直接访问内存地址和硬件资源,同时也支持结构化的程序设计。C语言的主要功能包括-支持过程化......
  • 【C语言1】C语言常见概念(总结复习篇)——库函数、ASCII码、转义字符
    文章目录前言一、C语言是什么?二、编译器的选择——VS2022三、main函数四、printf函数五、库函数六、关键字七、字符和ASCII编码八、字符串和'\0'九、转义字符十、注释总结前言上周考完四级(明年再战hh)和两门考试,接下来一个月将迎来其他学科的期末考试,所以这一个月......