ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2、Function Pointer及其应用Second

2021-04-24 19:33:54  阅读:132  来源: 互联网

标签:Function TStudent int void unsigned width Second num Pointer


Function Pointer及其应用Second

函数指针应用二:提供一种泛型的应用

我们写一个冒泡排序如何写呢?

最初的形式:CODE HERE

#include<iostream>
using namespace std;
void MySort(int A[], unsigned int  num)
{
    for (unsigned i = 1; i < num; i++)
    {
        for (unsigned j = 0; j < num - i; j++)
            if (A[j] > A[j + 1])
            {
                int tmp = A[j];
                A[j] = A[j + 1];
                A[j + 1] = tmp;
            }
    }
}
//上述代码显然不能提供一种泛型的解决方案
 

实际上这个代码只能处理int型的数据冒泡排序,而要提供一种支持所有形式数据排序代码的实现方式,我们可以用到函数指针:CODE HERE

struct TStudent
{
    char name[20];
    int age;
};
void MySort(void *base, unsigned width, unsigned num,
int(*compare)(const void *elem1, const void *elem2)){//这里使用函数指针使用void代表是不明确数据类型的参数,即应用了泛型
    char *A = (char *)base;   //取结构体数组开始的地址
    char *tmp = (char *)malloc(width);//可以自行搜索一下结构体在内存中存储的方式,一个结构体对象占width个字节空间,给结构体对象动态分配一个width大小的空间
    for (unsigned i = 1; i < num; i++) {
        for (unsigned j = 0; j < num - i; j++) {
            if (compare(A + j * width, A + (j + 1)*width) > 0){//if语句的条件判断是作为参数传递过来的一个参数
                memcpy(tmp, A + j * width, width);
                memcpy(A + j * width, A + (j + 1)*width, width);
                memcpy(A + (j + 1)*width, tmp, width);    //这三个语句是做了一次空间上的交换
            }
        }
    }
    free(tmp);
}
int icompare(const void *elem1, const void *elem2)
{
    TStudent *p1 = (TStudent *)elem1;
    TStudent *p2 = (TStudent *)elem2;
​
    return p1->age - p2->age;
}
int scompare(const void *elem1, const void *elem2)
{
    TStudent *p1 = (TStudent *)elem1;
    TStudent *p2 = (TStudent *)elem2;
​
    return strcmp(p1->name, p2->name);
}
​
​
int main() {
    TStudent student[] = { ("Alan",10),("Blan",18) };
    int num = sizeof(student) / sizeof(student[0]);
    int width = sizeof(student[0]);
    MySort(student, width, num, icompare);
    MySort(student, width, num, scompare);
}

大家可以自己在电脑上跑一下这两个代码,看一下实现上的不同,实际上函数指针在庞大系统的应用还是比较重要的

如果有什么不懂的地方可以看注释

END:该系列会持续更新,若有知识性的错误还请各位大佬们指出~

标签:Function,TStudent,int,void,unsigned,width,Second,num,Pointer
来源: https://blog.csdn.net/Jsusuxian/article/details/116101369

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有