文档章节

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

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

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

devops1024
06/26
0
0
嵌入式linux爱好者看过来

嵌入式的基础—C语言,针对C语言基础相对薄弱但是想学嵌入式的同学,我们特推出了系列课程,该系列课程包括:嵌入式Linux学习思路分析、C语言基础-数据类型、C语言基础-运算符与表达式、C语言...

farsightemb
2011/01/20
362
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
145
0

没有更多内容

加载失败,请刷新页面

加载更多

day92-20180918-英语流利阅读-待学习

健身最大的敌人不是懒惰,而是逞强 Daniel 2018-09-19 1.今日导读 还记得 2008 年北京奥运会运动员刘翔的退赛风波吗?那天几乎所有中国人都将视线聚焦在了鸟巢体育馆 110 米栏的项目上,迫不...

飞鱼说编程
23分钟前
2
0
70.shell的函数 数组 告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析 20.16/20.17 shell中的函数: ~1. 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段...

王鑫linux
今天
3
0
分布式框架spring-session实现session一致性使用问题

前言:项目中使用到spring-session来缓存用户信息,保证服务之间session一致性,但是获取session信息为什么不能再服务层获取? 一、spring-session实现session一致性方式 用户每一次请求都会...

WALK_MAN
今天
6
0
C++ yield()与sleep_for()

C++11 标准库提供了yield()和sleep_for()两个方法。 (1)std::this_thread::yield(): 线程调用该方法时,主动让出CPU,并且不参与CPU的本次调度,从而让其他线程有机会运行。在后续的调度周...

yepanl
今天
4
0
Java并发编程实战(chapter_3)(线程池ThreadPoolExecutor源码分析)

这个系列一直没再写,很多原因,中间经历了换工作,熟悉项目,熟悉新团队等等一系列的事情。并发课题对于Java来说是一个又重要又难的一大块,除非气定神闲、精力满满,否则我本身是不敢随便写...

心中的理想乡
今天
56
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部