文档章节

C语言学习—函数指针

紫电_清霜
 紫电_清霜
发布于 2015/10/20 17:04
字数 662
阅读 5
收藏 0
点赞 0
评论 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语言

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

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

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

四彩
2016/02/04
107
2
嵌入式linux爱好者看过来

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

farsightemb
2011/01/20
362
0
libevent源码深度剖析

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

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

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

小辰GG
2017/12/28
0
0
分享C语言/C++自学基础入门进阶技巧

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

小辰带你看世界
2017/12/31
0
0
C语言指针专题——为何要学习指针

欢迎转发本文!之前的文章与各位谈论了指针是什么,以及指针为何这那么难学。不少知友留言说看了我的文章对指针了解了不少,这给我继续创作提供了莫大的动力啊。指针其实就是一个纸老虎,你看...

石家的鱼
2017/04/11
0
0
小蚂蚁学习C语言(1)——C语言概述

C语言概述 1. 为什么学习C语言 C的起源和发展 1 第一代语言:机器语言 0101 2 第二代语言:汇编语言 add 1,2 3 第三代高级语言: C语言产生和发展过程: 产生时间:1972-1973 产生地点:美国...

嗜学如命的小蚂蚁
2015/11/26
180
4
C语言编程学习:出错信息的处理

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
05/15
0
0
《从零开始学Swift》学习笔记(Day 71)——Swift与C/C++混合编程之数据类型映射

原创文章,欢迎转载。转载请注明:关东升的博客 如果引入必要的头文件,在Objective-C语言中可以使用C数据类型。而在Swift语言中是不能直接使用C数据类型,苹果公司为Swift语言提供与C语言相...

智捷课堂
2016/03/02
19
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Boot Admin 2.0开箱体验

概述 在我之前的 《Spring Boot应用监控实战》 一文中,讲述了如何利用 Spring Boot Admin 1.5.X 版本来可视化地监控 Spring Boot 应用。说时迟,那时快,现在 Spring Boot Admin 都更新到 ...

CodeSheep
9分钟前
0
0
Python + Selenium + Chrome 使用代理 auth 的用户名密码授权

米扑代理,全球领导的代理品牌,专注代理行业近十年,提供开放、私密、独享代理,并可免费试用 米扑代理官网:https://proxy.mimvp.com 本文示例,是结合米扑代理的私密、独享、开放代理,专...

sunboy2050
51分钟前
0
0
实现异步有哪些方法

有哪些方法可以实现异步呢? 方式一:java 线程池 示例: @Test public final void test_ThreadPool() throws InterruptedException { ScheduledThreadPoolExecutor scheduledThre......

黄威
今天
1
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

六库科技
今天
0
0
牛客网刷题

1. 二维数组中的查找(难度:易) 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入...

大不了敲一辈子代码
今天
0
0
linux系统的任务计划、服务管理

linux任务计划cron 在linux下,有时候要在我们不在的时候执行一项命令,或启动一个脚本,可以使用任务计划cron功能。 任务计划要用crontab命令完成 选项: -u 指定某个用户,不加-u表示当前用...

黄昏残影
昨天
0
0
设计模式:单例模式

单例模式的定义是确保某个类在任何情况下都只有一个实例,并且需要提供一个全局的访问点供调用者访问该实例的一种模式。 实现以上模式基于以下必须遵守的两点: 1.构造方法私有化 2.提供一个...

人觉非常君
昨天
0
0
《Linux Perf Master》Edition 0.4 发布

在线阅读:https://riboseyim.gitbook.io/perf 在线阅读:https://www.gitbook.com/book/riboseyim/linux-perf-master/details 百度网盘【pdf、mobi、ePub】:https://pan.baidu.com/s/1C20T......

RiboseYim
昨天
1
0
conda 换源

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mir......

阿豪boy
昨天
1
0
Confluence 6 安装补丁类文件

Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中。这些问题将会使用 Class 类文件同时在官方 Jira bug...

honeymose
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部