• c/c++学习笔记(9)


    指向函数的指针

      在C/C++语言中,函数本身不是变量,但可以定义指向函数的指针。这种类型的指针可以被赋值、存放在数组中、传递给函数以及作为函数的返回值等等。由于指向函数的指针还是实践的比较多,书中是以改写快速排序为例子的,现在呢,我们就来编写一个线性排序。

     1 int lsearch(void *key, void *base, int n, int elementSize, int(*cmpfn)(void *, void *))
     2 {
     3     for(int i = 0; i < n; i++)
     4     {
     5         void *elementAddress = (char *)base + i * elementSize;
     6         if(cmpfn(key, elementAddress) == 0)
     7         {
     8             return i;
     9         }
    10     }
    11     return -1;
    12 }

      接下来,先做一个在int数组中查找元素,代码如下:

    1 int array[] = {1, 2, 3, 4, 5, 6, 7, 9};
    2 int size = 9;
    3 int number = 5;
    4 int index = lsearch(&number, array, size, sizeof(int), intcmp);
    5 printf("%d", index);

      因为intcmp是一个函数指针,其指向的是一个返回int且有2个void *参数的函数,实现如下:

    1 int intcmp(void *p1, void *p2)
    2 {
    3     int *num1 = (int *)p1;
    4     int *num2 = (int *)p2;
    5     return num1 - num2;
    6 }

      以上我们就是先了int版本的查找,接着我们来实现字符串类型的查找。

    1 char *arr[] = {"aa", "bb", "cc", "dd"};
    2 char *s = "aa";
    3 int size = 4;
    4 int index = lsearch(&s, arr, size, sizeof(char *), Strcmp);
    5 printf("%d", index);

      我们不能将这个函数指针定义为strcmp是因为库里面已经有这个函数了,且库里面的strcmp的2个参数是char *的,不匹配。Strcmp的实现如下:

    1 int Strcmp(void *p1, void *p2)
    2 {
    3     char *s1 = *(char **)p1;
    4     char *s2 = *(char **)p2;
    5     return strcmp(s1, s2);
    6 }

      到此,今天的学习就结束了,明天继续,加油!

  • 相关阅读:
    《Java数据结构与算法》笔记-CH4-5不带计数字段的循环队列
    《Java数据结构与算法》笔记-CH4-4循环队列
    效率方案:快速切换联调、测试、正式环境
    redis 安装、配置与测试
    计算机科学中的圣经
    自建主机
    正则表达式学习入门
    数据库查询语句缺失部分索引,引起的问题(20170209)
    redis 经验、问题以及其解决方案
    资讯周刊---20170210
  • 原文地址:https://www.cnblogs.com/ahl5esoft/p/2529449.html
Copyright © 2020-2023  润新知