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++构造和解析Json的使用示例

    C++构造和解析Json的使用示例 简介 Json是一种轻量级的数据交换格式,常用于前后端数据传输、配置文件等。本文将介绍在C++中如何构造和解析Json数据。 Json库 C++中有很多称手的Json库,常用的有: RapidJson nlohmann/json C++ Json 这些库都提供了简单易用的Api,形式上大同小异,具体使用可以结合文档查询。 …

    C 2023年5月23日
    00
  • 深入解析C语言中常数的数据类型

    深入解析C语言中常数的数据类型 在C语言中,常数的数据类型也是十分重要的。正确理解常数的类型、范围和精度对于编写高质量的程序至关重要。在本文中,我们将深入探讨C语言中常数的数据类型,并提供两个示例以帮助理解。 整数常数 在C语言中,整数常数可以表示为十进制、八进制或十六进制形式。整数常数的类型(即有符号或无符号)和大小(即占用的位数)取决于它的值和后缀。 举…

    C 2023年5月23日
    00
  • C语言中%d和%i格式说明符的区别

    下面是详细讲解“C语言中%d和%i格式说明符的区别”的完整使用攻略。 在C语言中,%d和%i两个格式说明符都是用来输出整数类型的变量的,但是它们有一些细微的区别。 区别一:进制数的输出 %d格式说明符会将输出的整数按照10进制输出,而%i格式说明符则会根据整数变量的前缀来输出对应的进制数。 举个例子,假设有一个十六进制的整数变量x,值为0x1F,使用%d和%…

    C 2023年5月10日
    00
  • .Net行为型设计模式之策略模式(Stragety)

    .Net行为型设计模式之策略模式(Strategy) 策略模式概述 策略模式是一种行为型设计模式,它定义了一系列算法,并且将每个算法封装起来,使得它们可以互相替换。策略模式让算法的变化独立于使用它们的客户端。 策略模式的组成 策略模式由以下几个部分组成: Context:上下文对象,它持有一个具体策略的引用,并调用具体策略的算法。 Strategy:策略接口…

    C 2023年5月23日
    00
  • awk命令、awk编程语言详细介绍和实例

    AWK命令、AWK编程语言详细介绍和实例 什么是AWK? AWK 是一种处理文本文件的工具,它的名字是由其创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的首字母组成的。 AWK 可以将数据分成记录和字段,是一种灵活、功能强大的文本分析工具。它最初是为 LINUX 操作系统设计的,现在已经移植到许多其他操作…

    C 2023年5月22日
    00
  • MySQL中查询json格式的字段实例详解

    MySQL中查询json格式的字段需要使用JSON函数。此处介绍几个常用的MySQL JSON函数。 JSON_EXTRACT JSON_EXTRACT可以用来提取json中的某个值,其语法如下: JSON_EXTRACT(json_obj, path) 其中,json_obj表示json对象,path表示要提取的值的路径。路径可以是简单的key或者是嵌套的…

    C 2023年5月23日
    00
  • 解析如何用指针实现整型数据的加法

    要实现指针实现整型数据的加法,可以按照以下步骤进行: 步骤一:定义两个整型变量a和b,并定义指向这两个变量的指针pa和pb。 int a = 5, b = 3; int *pa = &a, *pb = &b; 步骤二:定义一个变量sum来存储它们的和,将pa和pb所指向的变量值相加,并将结果赋值给sum变量。 int sum = *pa + …

    C 2023年5月23日
    00
  • VC WinExec打开指定程序或者文件的方法

    VC WinExec打开指定程序或者文件的方法 WinExec函数是VC++中用于调用Windows API的函数之一,主要用于打开指定程序或者文件。具体使用方式如下: WinExec函数语法 UINT WinExec( LPCSTR lpCmdLine, // 必须,指定启动的程序或文件名称及相应参数 UINT uCmdShow // 可选,指定程序窗口显…

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