函数指针的用途

1、给结构体排序

// 函数指针的用途。譬如:给结构体排序
struct User
{
    const char* name;
    int numb;
};

typedef int CFT (const void*, const void*);// 函数指针类型的定义

void ssort(void* base, int n, int sz, CFT comp)
/*
 对向量base的元素进行递增排序
 n是base的元素个数
 sz是元素的大小,即sizeof(base[0])
 comp是比较函数

 shell排序
*/
{
    for(int gap = n/2; gap>0; gap /= 2)
    {
        for(int i=gap; i<n; ++i)
        {
            for(int j=i-gap; 0<=j; j-=gap)
            {
                char* b = static_cast<char*>(base);// 必须强制转换
                char* pj = b + j*sz;        // &base[j]
                char* pjg = b + (j+gap)*sz;  // &base[j+gap]
                if(comp(pjg,pj)<0)   //若 base[j+gap] < base[j]; 则交换两者
                {
                    for(int k=0; k<sz; ++k)
                    {
                        char temp = pj[k];
                        pj[k] = pjg[k];
                        pjg[k] = temp;
                    }
                }
            }
        }
    }
}

int comp1(const void* p,const void* q) // 比较name
{
    return strcmp(static_cast<const User*>(p)->name, static_cast<const User*>(q)->name);
}

int comp2(const void* p,const void* q) // 比较numb
{
    return static_cast<const User*>(p)->numb - static_cast<const User*>(q)->numb;
}

int main()
{
    User v[] = {
        "wang", 100,
        "Lee", 101,
        "lee", 102,
        "allen", 99,
        };
    ssort(v,sizeof(v)/sizeof(v[0]),sizeof(v[0]),comp1);
    for(size_t i=0; i<sizeof(v)/sizeof(v[0]); ++i)
    {
        cout << v[i].name << " " << v[i].numb << endl;
    }
    cout << "-----------------\n";
    ssort(v,sizeof(v)/sizeof(v[0]),sizeof(v[0]),comp2);
    for(size_t i=0; i<sizeof(v)/sizeof(v[0]); ++i)
    {
        cout << v[i].name << " " << v[i].numb << endl;
    }
   return 0;
}

原文地址:https://www.cnblogs.com/htj10/p/10008694.html

时间: 2024-11-02 14:04:43

函数指针的用途的相关文章

深度剖析 函数指针

声明:以下代码全部在windows7  vs2010环境下编译通过,并执行无误. 全局函数指针 是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址. 函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参数. 函数指针的声明方法: 数据类型标志符(指针变量名)(形参列表): 一般函数的声明为: intfunc ( int x); 而一个函数指针的声明方法为: int (*func) (intx); 前面的那个(*func)中括号是

C++中的函数指针和函数对象总结

篇一.函数指针函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址.函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参数.函数指针的声明方法:数据类型标志符 (指针变量名) (形参列表):一般函数的声明为: int func ( int x );而一个函数指针的声明方法为:int (*func) (int x);前面的那个(*func)中括号是必要的,这会告诉编译器我们声明的是函数指针而不是声明一个具有返回型为指针的函

结构体中函数指针与typedef关键用途(函数指针)

// 结构体函数指针.  #include<stdio.h> //为了代码的移植考虑,一般使用typedef定义函数指针类 ,另一个好处是,减少代码的书写量.  typedef void (*shout)(char *name,int age); typedef struct {  //用指针来存储字符串     char *name;    int age ;    shout personinfo; }person; //类似于c++中类方法的实现,在这里,是为结构体中指针函数提供实现.在

用typedef定义函数指针类型(转)

typedef可以用于定义函数指针类型: [语法]typedef <返回类型> (*<函数类型名>)(参数表)typedef <返回类型> (<类名>::*<函数类型名>)(参数表) [用途]1.可以用来定义该函数类型的函数指针,就不用每次使用函数指针都要写一次函数原型了:2.有了类型名,就可以使用在容器里面,譬如map<int, 类型名>,用于实现灵活的函数调用. [示例] 例1:typedef void (*PF)(int x);

C基础--函数指针的使用

之前在看代码的时候,看了函数指针的使用,大体分为如下几类: 做一个function list,通过指针索引调用,使得处理功能类似的函数看起来更加清晰: 函数指针作为另一个函数的参数,用作回调: linux中经常使用来达到相同接口,实现不同,如: 1 struct platform_driver { 2 int (*probe)(struct platform_device *); 3 int (*remove)(struct platform_device *); 4 void (*shutdo

函数指针,function,bind, lambda

函数指针,sd::function<type1, type2...> functionObject, std::bind() 1. 函数指针是类型不安全的,为什么? #include<stdio.h> int max(int x,int y){return (x>y? x:y);} int main() { int (*ptr)(int, int); int a, b, c; ptr = max; scanf("%d%d", &a, &b)

C中函数指针的用法

理解了C中的声明和指针的话题后再来看函数指针的用法就很容易了. C中函数指针主要有两个用途: 1.作为参数传递给另外一个函数(即作为回调函数) 2.转换表(jump table) 下面分别来介绍作为回调函数的用法和作为转换表的用法 1.回调函数 在链表的查找中使查找函数与类型无关 /*在一个单链表中查找一个指定值的函数.它的参数是一个指向链表第一个节点的指针 * 一个指向我们需要查找的值的指针和一个函数指针,它所指向的函数用于比较存储于链表中的类型的值*/ #include <stdio.h>

指针数组,数组指针、指针函数,函数指针

听到这几个名词不知道大家什么感受,反正我是一脸懵逼,不过我还是比较好学的,在老师的指导下,自己下去也钻研了一下,有一些自己的见解,我想在学习过程中也有童鞋遇到了相同的问题,希望我的总结能给你带来帮助. 首先我们想明确一下这几个概念,知道他们都表示什么,ok,请看: 函数指针:函数指针是指向函数的指针变量. 因而"函数指针"本身首先应是指针变量,只不过该指针变量指向函数.这正如用指针变量可指向整型变量.字符型.数组一样,这里是指向函数.如前所述,C在编译时,每一个函数都有一个入口地址,该

函数指针、函数指针数组

参考:百度百科 |函数指针|词条. 指针_函数,就不说了.自己感觉就是So-easy的.[ 声明格式:returnType *Function(arguments); ] 重点是 函数指针,以及突然冒出来的 函数指针数组;(特别说明,我习惯先写代码,再写注释:情况A:代码在左,注释向右.情况B:代码在上,注释在下.) 函数指针,我形象的描述 函数<-指针,(文中一切有问题请指正,谢谢).[声明格式: returnType(*pointer)(arguments); ] 举例: int fun(i