`
tcspecial
  • 浏览: 896710 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

C void* 函数指针

阅读更多

   函数指针能够很方处理重复性工作,简化代码逻辑. 在C语言函数指针一般用于回调,传递函数名, 当数据回来时,执行函数指针所指向函数.

   下面看函数指针在计算器程序的经典运用:

  

int add(int a,int b)
{
	 return a+b;
}

int minus(int a,int b)
{
	return a-b;
}

int multiply(int a,int b)
{
	return a*b;
}

int devide(int a,int b)
{
	Q_ASSERT(b!=0);
	return a/b;
}      

 

 

  四个函数在形式上结构一致,只是函数名不同而已,我们可以用函数指针提炼其共性:

 

  

// 阶乘运算,只提供一个参数
int factorial(int a)
{
	if(a==1)
	return 1;
	
	return a*factorial(a-1);
}

  

 

  调用: cacl(10,5,add),动态执行相应的函数,从而达到面向对象式的设计方式 

  函数指针的使用三个步骤: 1.声明: typedef int (*FUNC)(int,int);

                                           2.赋值,让函数指针指向所要执行的函数: FUNC fun=devide;

                                           3.传递参数并调用: fun(12,11)

 

  对于上述函数只能传递同一种类型的函数指针,如果我现在增加一个新的函数(参数不一致),则上述函数又无法被调用了. 在这里我们就可以用void*万能指针来描述这个问题了.

 

  

//定义阶乘运算的函数指针
typedef int (*FAC)(int);

// 通用函数
int calc(int a,int b=-1,void *fun)
{
   if(b==-1)
   {
       return ((FAC)fun)(a); //执行强制转换
   }else
   {
       return ((FAC)fun)(a,b);
   }
}

calc(2,3,minus);  // c++下对函数指针要求比较严格,不能将void*转化为void (*)()

 

  

  

分享到:
评论

相关推荐

    动态数组实现(所有代码均使用C语言回调函数实现及存储数据均使用void*、void**实现)

    rar文件包含:Vector.h、Vector.c、main.c。主要实现自主定义回调函数结合及其在动态数组功能中的使用实例。存储数据使用void*、void**,其中包括结构体数据结构。主要功能有初始化动态数组、释放动态数组、尾插法、...

    双链表实现(所有代码均使用C语言回调函数实现及存储数据均使用void*、void**实现)

    rar文件包含:DoubleList.h、DoubleList.c、main.c。主要实现自主定义回调函数结合及其在双链表功能中的使用实例。存储数据使用void*、void**,其中包括结构体数据结构。主要功能有初始化双链表、释放双链表、尾插法...

    函数指针.txt

    让我们来分析一下 左边圆括弧中的星号是函数指针声明的关键 另外两个元素是函数的返回类型(void)和右边圆括弧中的入口参数(本例中参数是空) 注意本例中还没有创建指针变量 只是声明了变量类型 ">函数指针 void...

    ios socket demo

    简单Demo , 对socket 各个函数运用 核心代码 socket即网络, 这就是咱所用网络... // void * 万能指针 // 读取数据 ssize_t recv(int, void *, size_t, int) __DARWIN_ALIAS_C(recv); // 关闭连接 int close(int);

    彻底搞定C指针-函数名与函数指针

    函数名与函数指针 一 通常的函数调用 一个通常的函数调用的例子: //自行包含头文件 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int main(int argc, char* argv[]) { MyFun(10); //这里是调用...

    C语言实现魔塔游戏V1.0

    文件包括:main.c、mota.c、mota.h、Vector.h、Vector.c。...主要使用C语言结构体、函数指针(实现C语言回调函数)、自主定义动态数组(Vector.h),全过程使用void*,void**及函数指针回调函数实现。

    C++函数指针和回调函数使用解析

    函数指针 函数指针是指向函数的指针变量。 通常我们说的指针变量是指向一个整型变、字符型或数组等变量,而函数指针是指向函数。 函数指针可以像一般函数一样,用于调用函数、传递参数。 函数指针变量的声明: ...

    成员函数用于回调函数

    如qsort 等函数需要函数指针才能回调 用此函数库可以将成员函数指针转为普通函数指针 测试代码如下 #include #include #include #include #include #include using cmpfunc = int(__cdecl*)(const void*, ...

    详解C语言编程中的函数指针以及函数回调

    函数指针: 就是存储函数地址的指针,就是指向函数的指针,就是指针存储的值是函数地址,我们可以通过指针可以调用函数。 我们先来定义一个简单的函数: //定义这样一个函数 void easyFunc() { printf("I'm a easy...

    用c语言设计工资管理

    #include "stdio.h" /*I/O函数*/ # include "bios.h" /*ROM基本输入输出函数*/ #include "dos.h" /*dos接口函数*/ #include "conio.h" /*屏幕操作函数*/ #include "stdlib.h" /*其它说明*/ #include "string.h" /*...

    基于51单片机的c语言程序 GPRS远程控制系统

    *函数入口:字符串指针*str,字符串长度len *函数出口:无 *****************************************************************************************/ void send_str(uchar *str,uchar len) { uchar i; for(i...

    深入浅出剖析C语言函数指针与回调函数

    运行结果:从这个例子可以看到,我们首先定义了一个函数指针fuc,这个函数指针的返回值为void型,然后我们给函数指针赋值,赋值为print,也就是print函数的首地址,此时fuc获得了print的地址,fuc的地址等于print的地址...

    c语言malloc函数的用法和意义.pdf

    malloc时动态内存分配函数,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址 malloc函数原型 extern void *malloc(unsigned int num_bytes); 意为分配长度为num_bytes字节的内存块 ...

    qsort

    base 待排序的数组,melem 数组的元素个数,width 每个元素的大小, fcmp 用于对数组元素进行比较的函数指针,该函数由自己另外编写,有2个参数. <br>所属文件: <stdlib.h><br> <br>

    C语言中qsort函数的用法实例详解

    C语言中qsort函数的用法实例详解 快速排序是一种用的最多的排序算法,在C语言的标准库中也有快速排序的函数,下面说一下详细用法。...compar,指向函数的指针也即函数指针。这个函数用来比较两个数组元素,

    C语言指针-从底层原理到熟练应用(含源码)

    一、前言 二、变量与指针的本质 1. 内存地址 2. 32位与64位系统 3. 变量 4. 指针变量 5. 操作指针变量 三、指针的几个相关概念 1. const属性 2. void型指针 3. 空指针和野指针 ...6. 函数指针 五、总结

    c99 标准 的新特性学习

    C89中memcpy()函数原型如下: void *memcpy (void *s1, const void *s2, size_t size); 如果s1和s2所指向的对象重叠,其操作就是未定义的。memcpy()函数只能用于不重叠的对象。 C99中memcpy()函数原型如下:

    C语言指针和函数实例教程

    C语言指针和函数实例教程,#include void fun() { } int main() { printf('%p %p %p\n', &fun, fun, *fun); return 0; }

    详解C++中的指针、数组指针与函数指针

    C++中一个重要的特性就是指针,指针不仅具有获得地址的能力,还具有操作地址的能力。指针可以用于数组、或作为函数的参数,用来访问...常见的指针定义有3种:变量指针、数组指针和函数指针的定义。 (1)、变量指针的定

Global site tag (gtag.js) - Google Analytics