当前位置: 首页 > news >正文

通过网站提升公司形象外贸推广

通过网站提升公司形象,外贸推广,广西百度推广,企业融资以什么为基础指针函数指针函数就是一个返回值为指针类型的函数,没有特别的形式。int *function() {}函数指针本文主要讲解的内容是函数指针。指针本身是一个变量,是用来指向内存地址的。一个程序运行时,所有和运行相关的物件都是需要加载到内存中&#xf…

指针函数

        指针函数就是一个返回值为指针类型的函数,没有特别的形式。

int *function()
{}

函数指针

        本文主要讲解的内容是函数指针。指针本身是一个变量,是用来指向内存地址的。一个程序运行时,所有和运行相关的物件都是需要加载到内存中,这就决定了程序运行时的任何东西都可以用指针来指向它。函数是存放在内存代码区域内的,它们同样有地址,因此同样可以用指针来存取函数,把这种指向函数入口地址的指针称为函数指针。函数指针可以将函数作为参数传递、实现回调机制、创建函数表等高级功能。

        函数指针的声明

        函数指针在声明时需要指明返回值和函数的入口参数,标准的声明格式如下:

返回值类型 (*指针变量名)(参数类型列表);// 声明一个指向无参数、返回int的函数的指针
int (*func_ptr)(); // 声明一个指向两个int参数、返回float的函数指针
float (*calc_func)(int, int);//声明一个指向两个int参数,返回int *的函数指针
int *(*calc_func)(int, int);

        函数指针的使用

        函数指针在使用之前必须先声明,标明返回值和函数的入口参数类型,个数。

//声明一个指向返回值为int,入口参数为两个int的函数
int (*operation)(int,int);int add(int a,int b)
{return (a + b);
}operation = add;//为函数指针赋值// 等效调用方式
int result1 = operation(3, 5);     // 推荐写法
int result2 = (*operation)(3, 5);  // 传统写法

        这里可以看出,我们将add函数作为变量赋值给了operation这个函数指针,此时operation就指向了add函数,调用operation就相当于调用了add函数,调用方式有两种,直接使用operation比较方便,但是看不出来他是一个函数指针,使用(* operation)比较麻烦,但是可以看出来这是一个函数指针。实际使用中可以根据个人喜好使用。

        声明一个函数指针以后,就可以在程序内动态对其赋值,修改其实现的函数功能不必重新编辑代码,增加了使用的灵活性,在需要实现其他的函数功能时只需要将其指向其他函数即可。

        如果我们需要定义多个接口相同的函数指针,可以使用以下方式。

int (*operation1)(int,int);
int (*operation2)(int,int);
int (*operation3)(int,int);

        这种方式比较繁琐,效率低下且不易更改,更改时需要更改全部的定义。我们可以使用typedef进行更加标准化的定义。

#include <stdio.h>//此时opr就变为了一个类型别名,表示一种数据类型,也就是函数指针类型,可以用来声明函数指针变量
//用它定义的函数指针都是指向函数类型为返回值为int,接受两个int类型参数的函数
typedef int (*opr)(int,int);//声明了operation是一个opr类型的函数指针
opr operation;int add(int a,int b)
{return (a + b);
}int main()
{//之后就可以正常使用函数指针operationoperation = add;printf("%d\n",add(2,3));
}

        回调函数

        回调函数是一种通过函数指针调用的函数,函数指针是实现回调函数的核心机制。回调函数通常是将函数作为参数传递给其他函数,使得这些函数能够在特定事件或条件发生时调用回调函数。        

        以下述代码为例

        回调函数实现:

#include <stdio.h>
//声明回调接口规范
typedef int (*data_callback)(int data);
//处理方案A,与调用方完全解耦,调用方不用关心具体实现。
void process_a(int data)
{if(data > 10)printf("%d\n");
}
//处理方案B,可以独立修改,不影响其他方案。
void process_b(int data)
{if(data < 10)printf("%d\n");
}
//通过此函数可以调用不同的函数来实现具体功能
void handle_data(data_callback process,int data)
{process(data);
}int main()
{handle_data(process_a,5);//采用方案A的数据处理方式
}

        直接在函数中调用:

#include <stdio.h>
//处理方案1
void process_a(int data)
{if(data > 10)printf("%d\n");
}
//处理方案2
void process_b(int data)
{if(data < 10)printf("%d\n");
}
void handle_data(int data)
{process_a(data);
}
int main()
{handle_data(5);
}

        对比回调函数,直接调用这种方法也可以实现相应功能,但是如果需要更改方案,就需要重新编写handle_data,且容易影响原有方案的实现,风险性高,扩展性差,耦合性强,handle_data强依赖于process_a,且无法在程序运行中动态切换不同的实现方案;相反,回调函数的扩展性极强,增加新功能只需要添加新的process函数,且不依赖于某一process,只依赖特定接口,耦合性弱,各模块独立运行,适合通用处理框架。

        举例说明:

        直接调用时修改方案:需要修改handle_data中的内容为其他方案的函数。

#include <stdio.h>
void process_a(int data)
{if(data > 10)printf("%d\n");
}
void process_b(int data)
{if(data < 10)printf("%d\n");
}
void handle_data(int data)
{process_b(data);
}
int main()
{handle_data(5);
}

        回调函数修改方案:可以在程序运行时修改不同方案,只需要修改传入的函数指针即可,且方案之间相互独立,不用修改handle_data函数的内容。

#include <stdio.h>
//声明回调接口规范
typedef int (*data_callback)(int data);
//处理方案A,与调用方完全解耦,调用方不用关心具体实现。
void process_a(int data)
{if(data > 10)printf("%d\n");
}
//处理方案B,可以独立修改,不影响其他方案。
void process_b(int data)
{if(data < 10)printf("%d\n");
}
//通过此函数可以调用不同的函数来实现具体功能
void handle_data(data_callback process,int data)
{process(data);
}int main()
{handle_data(process_a,5);//采用方案A的数据处理方式handle_data(process_b,5);//采用方案B的数据处理方式
}

        总结回调函数的应用场景主要有以下几种:

        1、需要多态行为时:通过函数指针可以在运行时选择和调用不同的函数,增加程序的灵活性。比如可以选择不同的数据处理方案,在使用时传入不同的函数指针即可实现不同方案,且方案之间相互独立。

        2、中断响应:回调函数用于处理特定事件,如用户输入、定时器中断触发等。

        3、策略模式:运行时通过回调函数选择不同算法。

        4、插件和模块化设计:在插件和模块化设计中,回调函数用于实现扩展点和自定义行为。

        回调函数最大的特点在于调用方和被调用方的双向解耦:减少模块间的直接依赖关系,使系统各部分独立,模块间仅通过约定好的接口交互,不关心内部实现。这也是区别于普通函数调用的最大差异。

        回调函数的价值在于调用方和被调用方的双向解耦:在主入口程序中,把回调函数像参数一样传入函数。这样一来,只要我们改变传进函数的参数,就可以实现不同的功能,且不需要修改函数的实现,变的很灵活,这就是解耦。解耦减少模块间的直接依赖关系,使系统各部分独立,模块间仅通过约定好的接口进行交互,不关心内部实现。但是使用回调函数会产生间接的调用性能消耗,在性能绝对优先的情况下慎用。

 

http://www.dtcms.com/a/504190.html

相关文章:

  • 简述可口可乐公司的企业网站建设wordpress初始设置
  • 手机微官网和pc端网站怎么做展馆展示设计公司排名推荐
  • 一键完成系统命名、界面布局与操作习惯配置
  • MQTT 协议与 C#(MQTTnet)实战笔记:仓库温控系统开发
  • 网站地图 用户体验设计团队名称创意
  • 传奇网站发布网吴江公司注册
  • 做属于自己公司的网站设计网名姓氏
  • 专业级色彩转换、色卡渐变图生成工具
  • Java中的文件操作
  • jEasyUI 创建边框布局
  • 气球网站建设配资网站建设
  • Qt QML调用FFmpeg命令行(提取封面图)
  • XML Schema 复合元素 - 仅含文本
  • 学习Python中Selenium模块的基本用法(19:操作下拉框)
  • 注册个人网站要钱吗做外贸客户要求看网站
  • 湖北省建设人力资源网站个人备案网站改企业备案
  • 【JUnit实战3_03】第二章:探索 JUnit 的核心功能(二)
  • 微信公众号商城怎么开通株洲seo快速排名
  • 摩尔信使MThings网络性能实测
  • 国外网站兼职做效果图网站推广目标是什么
  • 企业建设网站的目的是做直播的视频在线观看网站
  • 色一把做最好网站福田欧曼银河报价
  • 新奇特:汉字句子中的暗物质和暗能量
  • 租用的网站空间的缺点免费ppt课件下载网站
  • 使用node Express 框架框架开发一个前后端分离的二手交易平台项目。
  • 如何统一管理多台电脑的基础系统设置?
  • 【算法】day8 二分查找+前缀和
  • 力扣160:相交链表
  • 用c做网站哈尔滨个人优化排名
  • 南部 网站 建设面试网站建设的问题