文档章节

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
沈阳
私信 提问
【C语言】学习笔记4——指针(1)

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

早起的虫儿去吃鸟
2018/08/19
0
0
最早接触到的计算机编程语言——c语言

最早接触到的计算机编程语言——C语言 在经过入学后计算机导论的熏陶后,在大一的下半学期我终于接触到了一门语言,这也是我们最早接触的计算机编程语言——c语言。 在初学的时候,感觉这门课...

devops1024
2018/06/26
0
0
业余爱好者的C程序设计学习之路

我学习和工作的方向都是化工,和 IT 专业一点边都不搭,属于程序设计爱好者一类。坚持了很多年了,谈谈我的认识。 一、为什么是C 汇编太难,直接下手会吓死宝宝的。 basic 不能考虑,因为“对...

四彩
2016/02/04
107
2
libevent源码深度剖析

原文地址:http://blog.csdn.net/sparkliang/article/details/4957667 libevent源码深度剖析一 ——序幕 张亮 1 前言 Libevent是一个轻量级的开源高性能网络库,使用者众多,研究者更甚,相关...

晨曦之光
2012/03/09
166
0
分享C语言/C++自学零基础入门到进阶学习资料技巧

学习C语言/C++之前,你必须首先要有一个正确的心态,没有一个正确心态的人是学不好任何东西的。你如果真想学好C语言/C++的话,你就要做好好好学它的准备,不要三心二意.面向对象是高级也是最...

小辰GG
2017/12/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周五乱弹 —— 姑娘馋的口水都留下来了。

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @且无需多言 :分享Fall Out Boy的单曲《Disloyal Order Of Water Buffaloes》 《Disloyal Order Of Water Buffaloes》- Fall Out Boy 手机党...

小小编辑
今天
35
6
vue 对对象的属性进行修改时,不能渲染页面 vue.$set()

我在vue里的方法里给一个对象添加某个属性时,我console.log出来的是已经更改的object ,但是页面始终没有变化 原因如下: **受现代 JavaScript 的限制 (而且 Object.observe 也已经被废弃),...

Js_Mei
今天
2
0
开始看《Java学习笔记》

虽然书买了很久,但一直没看。这其中也写过一些Java程序,但都是基于IDE的帮助和对C#的理解来写的,感觉不踏实。 林信良的书写得蛮好的,能够帮助打好基础,看得出作者是比较用心的。 第1章概...

max佩恩
昨天
12
0
Redux 三大原则

1.单一数据源 在传统的MVC架构中,我们可以根据需要创建无数个Model,而Model之间可以互相监听、触发事件甚至循环或嵌套触发事件,这些在Redux中都是不被允许的。 因为在Redux的思想里,一个...

wenxingjun
昨天
9
0
跟我学Spring Cloud(Finchley版)-12-微服务容错三板斧

至此,我们已实现服务发现、负载均衡,同时,使用Feign也实现了良好的远程调用——我们的代码是可读、可维护的。理论上,我们现在已经能构建一个不错的分布式应用了,但微服务之间是通过网络...

周立_ITMuch
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部