1、函数指针的形式:
  函数指针:int (*funcP) (int *a, int *b)

  表示定义了一个funcP函数指针,指向了返回值为int类型,参数为int* 和int* 的函数

  使用方式:

//代码实现了两数的交换
#include <stdlib.h>
#include <stdio.h>
int swap(int* num1, int* num2) {
int temp = *num1;
*num1 = *num2;
*num2 = temp;
}
int main()
{
int (*funcP) (int* a, int* b);
int num1 = 10;
int num2 = 20;
funcP = swap;
funcP(&num1, &num2);
printf("num1 = %d, num2 = %d\n", num1, num2); return 0;
}

上述代码运行结果为:num1 = 20, num1 = 10,实现了两个值的交换功能。

  同理我们可以定义出一个返回值为int类型,形参为char* 的函数指针:
  int(*funcP) (char* str)

  使用方式:

//本代码实现了strlen函数
#include <stdio.h>
#include <stdlib.h>
int myStrLen(char* str) {
    char* start = str;
    char* end = str;
    while (*end != '\0') {
        end++;
    }
    return end - start;
}
int main()
{
    char* str = "test";
    int len = myStrLen(str);
    printf("%d\n", len);
    return 0;
}

  运行结果为:4  

2、函数指针的应用之qsort函数:
 
 qsort函数:
       qsort(void* base, size_t ntimes, size_t size, int (*compar) (const void*, const void*)
  base 是要比较内容的地址;
  ntimes 是比较内容的个数,如整形数组a:ntimes = sizeof (a) / sizeof ( a[0])
  size 是要比较内容的单个类型的大小,如int:sizeof(int)
  compare 就是一个函数指针,具体使用方式如下:

//qsort函数的应用
#include <stdlib.h>
#include <stdio.h>
#include <string.h> //数组排序
int myCompareInt(const void *a, const void *b) {
unsigned int *p1, *p2;
p1 = (unsigned int*)a;//不能是a,因为类型不匹配
p2 = (unsigned int*)b;
// 返回a - b 从小到大,返回b - a 从大到小排序
return (*p2 - *p1);
}
//单字符按照ASSIC码排序
int myCompareChar(const void * a, const void * b) {
//从小到大排序按照assic
return (strcmp((char*)a, (char*)b));
//从大到小排序按照assic
return(strcmp((char*)b, (char*)a));
}
//知识点:char类型指向的本身就是地址,不能再解引用了,int需要解引用 #define NUM 5
int main()
{
unsigned int an[NUM] = {5,7,8,9,3};
qsort(an, sizeof(an) / sizeof(an[0]), sizeof(an[0]),myCompareInt);
for (int i = 0; i < NUM; i++) {
printf("%d ",an[i]);
}
printf("\n"); char* str1 = "aefdcb";
char str2[] = "aefdcb";
qsort(str2, strlen(str2), sizeof(char), myCompareChar);
printf("%s\n",str2);
int (*funcP) (int* a, int* b);
return 0;
}

文提到了一个段错误的问题,这里特别强调一下段错误
段错误就是指访问的内存超出了系统给这个程序所设定的内存空间,例如,访问了不存在的内存地址,访问了系统保护的内存地址,访问了只读的内存地址等情况,小章节详细记录段错误

函数指针和qsort函数的更多相关文章

  1. qsort中的函数指针,及函数解释

    函数指针有何用 函数指针的应用场景比较多,以库函数qsort排序函数为例,它的原型如下: void qsort(void *base,size_t nmemb,size_t size , int(*c ...

  2. [Reprint]C++普通函数指针与成员函数指针实例解析

    这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下   C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般 ...

  3. C 函数指针与回调函数

    函数指针是指向函数的指针变量. 通常我们说的指针变量是指向一个整型.字符型或数组等变量,而函数指针是指向函数. 函数指针可以像一般函数一样,用于调用函数.传递参数. 函数指针变量的声明: #inclu ...

  4. C++ 类的多态三(多态的原理--虚函数指针--子类虚函数指针初始化)

    //多态的原理--虚函数指针--子类虚函数指针初始化 #include<iostream> using namespace std; /* 多态的实现原理(有自己猜想部分) 基础知识: 类 ...

  5. 深入浅出剖析C语言函数指针与回调函数(一)【转】

    本文转载自:http://blog.csdn.net/morixinguan/article/details/65494239 关于静态库和动态库的使用和制作方法. http://blog.csdn. ...

  6. C语言之函数指针、回调函数的使用

    一.背景 首先看下如下代码,这个定义是放在头文件的,在程序中tCdrvCallbackFkt也定义了另一个变量,而且括号后面还跟定义了几个变量,不理解这个定义. typedef void (PUBLI ...

  7. VC++的函数指针和回调函数 及友元函数

    什么是函数指针 函数指针是指向函数的指针变量.也就是说,它是一个指针变量,而且该指针指向一个函数. 对于指针变量来说,它的值是它指向的变量的地址.举个例子:指针变量pi是指向一个整型变量i的指针,则变 ...

  8. C 函数指针、回调函数

    参考链接:https://www.runoob.com/cprogramming/c-fun-pointer-callback.html 函数指针 函数指针就是执行函数的指针,他可以像正常函数一样去调 ...

  9. C语言函数指针和回调函数

    彻底搞定C指针-函数名与函数指针 函数名&函数名取地址 函数指针 通常我们可以将指针指向某类型的变量,称为类型指针(如,整型指针).若将一个指针指向函数,则称为函数指针. 函数名的意义 函数名 ...

随机推荐

  1. VUE005. 在data中使用 / 改变data,或在data中调用method函数

    使用三方UI库时经常会遇到在data中写入方法的场景,如Element-UI的级联选择器(动态加载part)需要在data中写入lazyLoad. 但后端总会给出意想不到的需求: 通过接口调取一串数据 ...

  2. 小白也能看懂的dubbo3应用级服务发现详解

    搜索关注微信公众号"捉虫大师",后端技术分享,架构设计.性能优化.源码阅读.问题排查.踩坑实践. 本文已收录 https://github.com/lkxiaolou/lkxiao ...

  3. 添加class和删除class以及判断是否含有class

      addClass(document.body, 'showRightPanel') removeClass(document.body, 'showRightPanel') /**  * Add  ...

  4. linux下分卷压缩,合并解压的3种方法

    我们上传东西的时候,由于文件过大而不能上传,或者不给上传,最明显的就是发邮件了,附件最大5M,有的10M.如果超过了就郁闷了.这个时候,如果能把压缩的东西,分割开来就比较爽了,windows下面我想大 ...

  5. POJ2352 Stars (静态二叉检索树)

    https://vjudge.net/problem/POJ-2352 分析: 由于是按照y坐标的升序,y坐标向等的按x的升序的顺序给出星星.那么某个星星的等级数就是在他前面x坐标小于等于他的x坐标的 ...

  6. Shell系列(30)- 单分支if语句判断分区使用率

    需求 监控分区已用空间,超过80%,抛出警告 脚本 #!/bin/bash #给tets赋值用于接收参数,传递给if进行判断 #申明变量test并赋值,由于赋的值是系统变量的结果,所以得用$()引用 ...

  7. Mysql Navicate 基础操作与SQL语句 版本5.7.29

    SQL数据的增删改查:此部分所有SQL语句在navicat中与mysql命令行执行效果一样,只是mysql服务端在命令行执行,而navicat只是在客户端的图形化打开操作. 一.进入数据库 .连接数据 ...

  8. php stream 流封装协议

    http://php.net/manual/wrappers.php 过程: 1. 开始通信 2. 读取数据 3. 写入数据 4. 结束通信 usage: * 读写文件系统 <?php $han ...

  9. session入库

    #存储session的数据表示列结构,可作为参考#创建数据库(可选)CREATE DATABASE session;#使用创建的数据库(可选)USE session;#创建存储session的数据表( ...

  10. docker network 参数

    一. 格式 docker network COMMAND 二.COMMAND 讲解 2.1 .docker network connect 格式 docker network connect [OPT ...