文档章节

C语言学习—函数指针

紫电_清霜
 紫电_清霜
发布于 2015/10/20 17:04
字数 662
阅读 5
收藏 0

阿里云携手百名商业领袖、技术大咖,带您一探行进中的数字新基建!>>>

一.函数指针定义

    函数地址:函数名和数组名一样是地址. 

int maxValue(int a, int b)
{
    return a > b ? a : b;
}
//maxValue是函数名,即是函数地址

    函数指针定义

int maxValue(int a, int b)
int (*p)(int ,int ) = NULL;
//函数指针定义,p是变量,其它是类型

     函数指针使用

p = maxValue;//赋值函数名
int m = p(3, 5);//指针可以当函数用

二.回调函数

    函数指针做参数

int getValue(int a, int b, int (*p)(int , int));
//getValue是函数名,函数指针做getValue函数的参数

    函数调用

int value = getValue(3, 5, maxValue)
//getValue执行过程中在调用(回调) maxValue

三.动态排序

    排序

void sortArray(int * arr, int count){
    for(int i = 0; i < count - 1; i ++){
        for(int j = 0;j < count - i - 1; j ++){
            if(条件) {
                交换;
            }
        }
      }
    //注意:决定排序方式的重要语句封装成函数后在此回调

    int 数组动态排序

  typedef BOOL (*PFUN) (int , int);
  //为函数指针类型起别名为PFUN
  
  void sortArray(int *arr, int count, PFUN p);
  //动态排序函数声明

四.函数返回值是函数指针

    返回值为函数指针

PFUN getFunctionByName(char * name);
//通过功能名称查找对应的函数

    数据结构

typedef struct nameFunctionPair
{
    char name[30];
    PFUN function;
}NameFunctionPair;

    查找对应函数

PFUN fun = NULL;
fun = getFunctionByName("min");

    调用返回的函数

int value = fun(3, 5);
//使用返回的函数指针调用函数,完成动态调用

五.练习代码

#include<stdio.h>
void printfArray(int *arr, int count)
{
    for (int i = 0; i < count; i ++) {
        printf("%2d ", arr[i]);
    }
    printf("\n");
}
//    1.(***)随机生成一个10个元素的数组,找到3的倍数,并将其值修改成0.(注意:修改数值使用回掉函数处理)
void changeValue(int *value)
{
    if (0 == *value % 3) {
        *value = 0;
    }
}
void getValue(int *arr, int count, void (*p)(int *))
{
    for (int i = 0; i < count; i ++) {
        p(arr + i);
    }
}
//    2. (***)有两个10个元素的数组,分别为A和B,编程实现相同位置的元素,
//    如果B的元素小于A的元素进行数值交换:(使用回调函数实现)
void changeV(int *number1, int *number2)
{
    if (*number1 < *number2) {
        int temp = *number1;
        *number1 = *number2;
        *number2 = temp;
    }
}

void changeArrayElementValue(int *arr1, int *arr2, int count, void (*p)(int *, int *))
{
    for (int i = 0; i < count; i ++) {
        p(arr1 + i, arr2 + i);
    }
}

int main(int argc, const char * argv[]) {
    //题1
    int arr[10] = {0};
    for (int i = 0; i < 10; i ++) {
        arr[i] = arc4random() % 20 + 1;
    }
    printfArray(arr, 10);
    
    getValue(arr, 10, changeValue);
    
    printfArray(arr, 10);
    
    
    //题2
    int myarr1[10] = {0};
    int myarr2[10] = {0};
    for (int i = 0; i < 10; i ++) {
        myarr1[i] = arc4random() % 90 + 1;
        myarr2[i] = arc4random() % 90 + 1;
    }
    printf("\n");
    printfArray(myarr1, 10);
    printfArray(myarr2, 10);
    printf("\n");
    changeArrayElementValue(myarr1, myarr2, 10, changeV);
    printfArray(myarr1, 10);
    printfArray(myarr2, 10);
    
    return 0;
}






© 著作权归作者所有

紫电_清霜
粉丝 2
博文 10
码字总数 7921
作品 0
沈阳
私信 提问
加载中

评论(0)

你可以这样学习C语言 - 知乎

声明:我已加入“维权骑士”(维权骑士免费版权监测/版权保护/版权分发)的版权保护计划。 我在今日头条上开了一个专栏,专栏名字是“你可以这样学习C语言”。C语言算是一门比较难学的编程语言...

C语言编程答疑
2019/10/21
0
0
20165231 预备作业二:学习基础和C语言基础调查

微信文章感想 读了娄老师微信公众号中的文章,老师给我们的启示首先就是要坚持,万事开头难,但是只要肯坚持就一定会有所成就,不管是学习还是生活方面。其中最有触动的就是减肥了,是我三四...

osc_klnoz5bx
2018/01/30
2
0
2019年春季学期《C语言程序设计II》课程总结

2019年春季学期《C语言程序设计II》课程总结 ####1.课程情况 教学内容 课堂小结 作业安排 优秀作业 备注 1.开学谈心 2.测验数据类型、运算符与表达式的自学情况,并讲解测验题目3.第七章 数组...

osc_bkdv2it5
2019/08/19
8
0
C语言核心编程-夏曹俊-专题视频课程

C语言核心编程—168人已学习 课程介绍 C语言并不是一个高级语言,它实际上属于高级语言与低级语言之间的中间语言,它直接与内存打交道,丰富的数据类型、运算符,但是C语言绝非是一门简单的语...

夏曹俊
03/31
0
0
【C语言】学习笔记4——指针(1)

1. 指针:一种以符号形式使用地址的方法。   因为计算机的硬件指令非常依赖地址, 所以使用指针的程序更有效率。尤其是, 指针能有效地处理数组,数组地表示法其实是在变相地使用指针。  ...

早起的虫儿去吃鸟
2018/08/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

假使年轻的时候鞭策自己

我自己就是浪费了很多时间的一个人。我不打麻将,我不经常的听戏看电影,几年中难得一次,我不长时间看电视,通常只看半个小时,我也不串门子闲聊天。有人问我:“那么你大部分时间都做了些什...

瑾123
29分钟前
13
0
文章错别字检测软件有哪些?蚁小二真的好用

文章错别字检测软件有哪些?蚁小二真的好用,据市场研究调查发现,我们对文章当中错别字的检测和修改这样的需求是一直存在的,只是市场上面还没有一个比较好用的软件来辅助我们做错别字检测。...

一键分发工具-蚁小二
32分钟前
24
0
文章原创度检测工具有哪些?这些工具你可以拥有

文章原创度检测工具有哪些?这些工具你可以拥有,随着自媒体行业的发展,现在很多自媒体人都进入到互联网行业,但是随着大家的深入发展,会发现有时候自己的文章在自媒体平台上推荐很少,其实...

易撰
33分钟前
9
0
FTP工具软件,FTP工具软件下载!

IIS7服务器管理工具是一款FTP的客户端软件,能够批量执行FTP的命令!可以提高FTP的传输效率! 同时,它也可以作为VNC的客户端,能够进行相关的VNC操作;同时,它还可以批量连接Windows和Lin...

Raymond13
33分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部