函数指针能够很方处理重复性工作,简化代码逻辑. 在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 (*)()
相关推荐
rar文件包含:Vector.h、Vector.c、main.c。主要实现自主定义回调函数结合及其在动态数组功能中的使用实例。存储数据使用void*、void**,其中包括结构体数据结构。主要功能有初始化动态数组、释放动态数组、尾插法、...
rar文件包含:DoubleList.h、DoubleList.c、main.c。主要实现自主定义回调函数结合及其在双链表功能中的使用实例。存储数据使用void*、void**,其中包括结构体数据结构。主要功能有初始化双链表、释放双链表、尾插法...
让我们来分析一下 左边圆括弧中的星号是函数指针声明的关键 另外两个元素是函数的返回类型(void)和右边圆括弧中的入口参数(本例中参数是空) 注意本例中还没有创建指针变量 只是声明了变量类型 ">函数指针 void...
简单Demo , 对socket 各个函数运用 核心代码 socket即网络, 这就是咱所用网络... // void * 万能指针 // 读取数据 ssize_t recv(int, void *, size_t, int) __DARWIN_ALIAS_C(recv); // 关闭连接 int close(int);
函数名与函数指针 一 通常的函数调用 一个通常的函数调用的例子: //自行包含头文件 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int main(int argc, char* argv[]) { MyFun(10); //这里是调用...
文件包括:main.c、mota.c、mota.h、Vector.h、Vector.c。...主要使用C语言结构体、函数指针(实现C语言回调函数)、自主定义动态数组(Vector.h),全过程使用void*,void**及函数指针回调函数实现。
函数指针 函数指针是指向函数的指针变量。 通常我们说的指针变量是指向一个整型变、字符型或数组等变量,而函数指针是指向函数。 函数指针可以像一般函数一样,用于调用函数、传递参数。 函数指针变量的声明: ...
如qsort 等函数需要函数指针才能回调 用此函数库可以将成员函数指针转为普通函数指针 测试代码如下 #include #include #include #include #include #include using cmpfunc = int(__cdecl*)(const void*, ...
函数指针: 就是存储函数地址的指针,就是指向函数的指针,就是指针存储的值是函数地址,我们可以通过指针可以调用函数。 我们先来定义一个简单的函数: //定义这样一个函数 void easyFunc() { printf("I'm a easy...
#include "stdio.h" /*I/O函数*/ # include "bios.h" /*ROM基本输入输出函数*/ #include "dos.h" /*dos接口函数*/ #include "conio.h" /*屏幕操作函数*/ #include "stdlib.h" /*其它说明*/ #include "string.h" /*...
*函数入口:字符串指针*str,字符串长度len *函数出口:无 *****************************************************************************************/ void send_str(uchar *str,uchar len) { uchar i; for(i...
运行结果:从这个例子可以看到,我们首先定义了一个函数指针fuc,这个函数指针的返回值为void型,然后我们给函数指针赋值,赋值为print,也就是print函数的首地址,此时fuc获得了print的地址,fuc的地址等于print的地址...
malloc时动态内存分配函数,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址 malloc函数原型 extern void *malloc(unsigned int num_bytes); 意为分配长度为num_bytes字节的内存块 ...
base 待排序的数组,melem 数组的元素个数,width 每个元素的大小, fcmp 用于对数组元素进行比较的函数指针,该函数由自己另外编写,有2个参数. <br>所属文件: <stdlib.h><br> <br>
C语言中qsort函数的用法实例详解 快速排序是一种用的最多的排序算法,在C语言的标准库中也有快速排序的函数,下面说一下详细用法。...compar,指向函数的指针也即函数指针。这个函数用来比较两个数组元素,
一、前言 二、变量与指针的本质 1. 内存地址 2. 32位与64位系统 3. 变量 4. 指针变量 5. 操作指针变量 三、指针的几个相关概念 1. const属性 2. void型指针 3. 空指针和野指针 ...6. 函数指针 五、总结
C89中memcpy()函数原型如下: void *memcpy (void *s1, const void *s2, size_t size); 如果s1和s2所指向的对象重叠,其操作就是未定义的。memcpy()函数只能用于不重叠的对象。 C99中memcpy()函数原型如下:
C语言指针和函数实例教程,#include void fun() { } int main() { printf('%p %p %p\n', &fun, fun, *fun); return 0; }
C++中一个重要的特性就是指针,指针不仅具有获得地址的能力,还具有操作地址的能力。指针可以用于数组、或作为函数的参数,用来访问...常见的指针定义有3种:变量指针、数组指针和函数指针的定义。 (1)、变量指针的定