C语言 函数指针

C语言 函数指针使用攻略

函数指针是C语言中一个非常有用的特性,它允许我们将函数的地址作为参数传递给另一个函数,或者作为另一个函数的返回值,从而提高函数的灵活性和可重用性。下面将详细介绍如何使用函数指针。

函数指针的声明

函数指针的声明与变量的声明类似,只不过要在函数名前加上“*”,例如:

int (*p)(int, int);

表示“p”是一个指向返回类型为int,参数类型为int和int的函数指针。注意,函数指针的类型要与被指向函数的类型严格匹配。

函数指针的定义与赋值

函数指针的定义与变量的定义类似,可以在声明时同时定义,也可以单独定义。例如:

int (*p)(int, int) = NULL;
p = func;

其中,“func”是一个函数名,表示函数的地址。函数指针可以通过“&”符号取得函数的地址,例如:

p = &func;

函数指针也可以作为参数传递给函数,例如:

void print(int (*p)(int, int), int x, int y)
{
    printf("%d\n", p(x, y));
}

这个函数接收一个函数指针“p”作为参数,并且调用“p”函数,传递两个整数参数“x”和“y”。当“p”被调用时,实际执行的是“p”所指向的函数。

函数指针还可以作为函数的返回值,例如:

int (*getFunc())(int, int)
{
    return func;
}

这个函数返回一个函数指针,指向一个返回类型为int,参数类型为int和int的函数。

示例1:排序函数

函数指针特别适合用于实现通用的排序函数。例如,下面是一个采用函数指针实现的快速排序函数:

void quickSort(int *arr, int left, int right, int (*cmp)(int, int))
{
    if (left >= right) {
        return;
    }
    int pivot = arr[(left + right) / 2];
    int i = left, j = right;
    while (i <= j) {
        while (cmp(arr[i], pivot)) {
            i++;
        }
        while (cmp(pivot, arr[j])) {
            j--;
        }
        if (i <= j) {
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            i++;
            j--;
        }
    }
    quickSort(arr, left, j, cmp);
    quickSort(arr, i, right, cmp);
}

这个函数接收一个整数数组“arr”,数组的左边界“left”和右边界“right”,以及一个函数指针“cmp”。在排序过程中,通过“cmp”指向的函数来比较两个整数的大小,从而实现升序排列或降序排列。

下面是一个比较函数的示例,用于按照升序排列:

int cmpAsc(int a, int b)
{
    return a < b;
}

我们可以将这个比较函数传递给快速排序函数,并对一个整数数组进行排序:

int main()
{
    int arr[] = {6, 2, 3, 5, 4, 1};
    int size = sizeof(arr) / sizeof(arr[0]);
    quickSort(arr, 0, size - 1, cmpAsc);
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    return 0;
}

输出结果为:

1 2 3 4 5 6

示例2:回调函数

函数指针还可以用于回调函数的实现。回调函数是指在一个函数中调用另一个函数,并以函数指针的形式将回调函数传递给被调用的函数。回调函数常用于事件处理、状态监测等场合。

例如,下面是一个模拟登录的函数,用于验证用户名和密码是否正确:

int login(char *username, char *password)
{
    if (strcmp(username, "admin") == 0 && strcmp(password, "admin123") == 0) {
        return 1;
    } else {
        return 0;
    }
}

这个函数接收两个字符串参数“username”和“password”,如果用户名和密码正确,则返回1,否则返回0。

我们可以写一个登录界面,并使用回调函数来处理登录成功和失败事件:

void onLoginSuccess()
{
    printf("Login success!\n");
}

void onLoginFailure()
{
    printf("Login failure!\n");
}

int main()
{
    char username[64], password[64];
    printf("Username: ");
    scanf("%s", username);
    printf("Password: ");
    scanf("%s", password);
    if (login(username, password)) {
        onLoginSuccess();
    } else {
        onLoginFailure();
    }
    return 0;
}

在这个程序中,如果登录成功,则调用“onLoginSuccess”函数,否则调用“onLoginFailure”函数。我们可以像这样编写任意类型的回调函数,并将其传递给各种各样的函数,用于处理不同的业务逻辑。

总结

函数指针是C语言中一个非常有用的特性,可以提高函数的灵活性和可重用性。在实际编程中,我们可以利用函数指针来实现通用的排序、查找、回调等功能,提高程序的效率和健壮性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言 函数指针 - Python技术站

(0)
上一篇 2023年5月9日
下一篇 2023年5月9日

相关文章

  • C 语言基础教程(我的C之旅开始了)[七]

    针对“C 语言基础教程(我的C之旅开始了)[七]”这篇文章,我将为您进行详细讲解。 概述 文章主要讲解 C 语言中的数组。内容涉及数组的定义、初始化、访问以及数组名的特性等方面。 数组的定义 在 C 语言中,数组是一组类型相同的元素所组成的集合。我们可以通过声明一个数组来定义一个由多个元素构成的数组。 数组的一般定义形式为 type arrayName[ar…

    C 2023年5月23日
    00
  • 关于C语言程序的内存分配的入门知识学习

    关于C语言程序的内存分配的入门知识,要了解到以下内容: 1. 内存的基本概念 计算机是由中央处理器(CPU)、内存和硬盘等电子装置组成的。内存是程序运行时存储数据和代码的临时存储器,程序每次运行都需要占用内存,当程序结束后就会释放相应的内存。 2. 栈与堆的比较 在程序中,常见的内存分配方式有栈和堆两种,它们都是存储数据的区域,但其具体的使用方式有所不同。-…

    C 2023年5月23日
    00
  • C语言简明讲解操作符++和–的使用方法

    C语言简明讲解操作符++和–的使用方法 操作符++和–的基本概念 操作符++和–是C语言中的两种自增、自减操作符。它们作用于一个变量,可以将该变量的值自增1或自减1。 操作符++:将变量的值自增1,等同于var = var + 1。 操作符–:将变量的值自减1,等同于var = var – 1。 这两个操作符都可以在变量前面或后面使用,从而分别产生前…

    C 2023年5月23日
    00
  • C 程序 查找给定范围内的素数

    下面是C程序查找给定范围内素数的完整使用攻略。 程序简介 这个C程序的主要功能是查找给定范围内的素数。用户需要输入一个起始数值和一个结束数值,程序会输出这个范围内的所有素数。程序的具体实现方式是使用了一个嵌套的for循环进行遍历,逐个判断每个数是否是素数。 使用方法 克隆或下载程序的源代码; 打开终端或命令提示符; 切换到程序的源代码目录; 使用C编译器编译…

    C 2023年5月9日
    00
  • 史上最贴心的 VS code C++ 环境配置超详细教程

    史上最贴心的 VS code C++ 环境配置超详细教程 1. 环境说明 本教程为在 Windows 10 操作系统下使用 VS code 编辑器配置 C++ 开发环境的详细教程。在配置过程中,我们使用 MinGW C++ 编译器和 CMake 构建工具。 2. 环境准备 安装 MinGW 编译器 访问 MinGW 官网,下载最新的 mingw-get-se…

    C 2023年5月23日
    00
  • C指针原理教程之AT&T汇编

    C指针原理教程之AT&T汇编攻略 什么是C指针? C语言中的指针是一种特殊的变量类型,它的值是内存地址。指针可以用于访问变量或函数,并对它们进行操作。指针可以指向任何数据类型,包括整型、字符型、浮点型、结构体、数组等等。 AT&T汇编语法 AT&T汇编语法和Intel汇编语法有所不同。AT&T汇编语法中,源操作数在左边,目的操…

    C 2023年5月23日
    00
  • c语言B树深入理解

    C语言B树深入理解 B树是一种平衡多路搜索树,主要应用于文件系统以及数据库系统中。它与AVL树、红黑树等平衡二叉搜索树不同之处在于,B树每个节点可以存储多个键值,并且树的平衡是通过节点之间的合并和分裂操作进行维护的。 B树结构 B树是一种多路搜索树,它的每个节点中包含多个key和value。一个节点内最多包含m个key值和m+1个指向其它节点的指针,每个节点…

    C 2023年5月22日
    00
  • Win11无法找到脚本文件c:users\administrator怎么办?

    针对“Win11无法找到脚本文件c:users\administrator怎么办?”这个问题,一般会出现在Win11系统中启动或者运行特定应用程序时,提示找不到指定路径的脚本文件。解决这个问题需要进行以下步骤: 检查文件路径是否正确:在命令提示符或者Powershell中输入dir命令检查目标路径下是否存在对应的文件。如果不存在,则需要重新定位目标路径,或者…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部