C语言函数指针入门基础(2)

很显然,这是一个接受两个const void*类型入参,返回值为int的函数指针。
到这里也就很清楚了。这个参数告诉qsort,应该使用哪个函数来比较元素,即只要我们告诉qsort比较大小的规则,它就可以帮我们对任意数据类型的数组进行排序。

在这里函数指针作为了参数,而他同样可以作为返回值,创建数组,作为结构体成员变量等等,它们的具体应用我们在后面的文章中会介绍,本文不作展开。本文只介绍一个简单实例。

实例介绍

我们通过一个实例来看函数指针怎么使用。假设有一学生信息,需要按照学生成绩进行排序,该如何处理呢?

#include <stdio.h>
#include <stdlib.h>
#define STU_NAME_LEN 16
/*学生信息*/
typedef struct student_tag
{
    char name[STU_NAME_LEN];  //学生姓名
    unsigned int id;          //学生学号
    int score;                //学生成绩
}student_t;
int studentCompare(const void *stu1,const void *stu2)
{
  /*强转成需要比较的数据结构*/
    student_t *value1 = (student_t*)stu1;
    student_t *value2 = (student_t*)stu2;
    return value1->score-value2->score;
}
int main(void)
{
    /*创建三个学生信息*/
    student_t stu1 = {"one",1,99};
    student_t stu2 = {"two",2,77};
    student_t stu3 = {"three",3,88};

    student_t stu[] = {stu1,stu2,stu3};

    /*排序,将studentCompare作为参数传入qsort*/
    qsort((void*)stu,3,sizeof(student_t),studentCompare);
    int loop = 0;

    /**遍历输出*/
    for(loop = 0; loop < 3;loop++)
    {
        printf("name:%s,id:%u,score:%d\n",stu[loop].name,stu[loop].id,stu[loop].score);
    }
    return 0;
}

我们创建了一个学生信息结构,结构成员包括名字,学号和成绩。main函数中创建了一个包含三个学生信息的数组,并使用qsort函数对数组按照学生成绩进行排序。qsort函数第四个参数是函数指针,因此我们需要传入一个函数指针,并且这个函数指针的入参是cont void *类型,返回值为int。我们通过前面的学习知道了函数名本身就是指针,因此只需要将我们自己实现的studentCompare作为参数传入即可。

最终运行结果如下:

name:two,id:2,score:77
name:three,id:3,score:88
name:one,id:1,score:99

可以看到,最终学生信息按照分数从低到高输出。

总结

本文介绍了函数指针的声明和简单使用。更多使用将在后面的文章介绍,本文总结如下:

函数指针与其他指针类型无本质差异,不过它指向的是函数的地址罢了。

声明函数指针需要指明函数的返回类型和形参类型。

函数名在被使用时总是由编译器把它转换为函数指针。

要想声明函数指针,只需写出函数原型,然后将函数名用(*fp)代替即可。这里fp是声明的函数指针变量。

typedef中声明的类型在变量名的位置出现。

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/36f02eae4eb0e271a690f66b9cc53faa.html