阅读raft源码的时候看到结构体里面的void(*xx)

看不懂这个地方,看上去又像面向对象的类方法,但是这是c语言的结构体啊,了解了这是函数指针。小趴菜~

一、函数指针

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

正确形式:int (*f) ( );

这个声明有两对括号,每对的含义各不相同。第2对括号是函数调用操作符,但第1对括号只起到聚组的作用。它迫使间接访问在函数调用之前进行,使f成为一个函数指针,它所指向的函数返回一个整型值。

容易混淆的地方:int (*f)(); 与 int * f ();

两者看似只相差了一个(),但是在编译器看来却是两种截然不同的情况。

int (*f) () :这里 “f” 是一个函数指针 ,它存储着一个没有参数,返回值为int类型的函数的地址。

int *f () :这里 “f” 是一个函数名,它没有参数,返回一个指针,int *类型。

函数指针的调用方式

void test(int);int main(void)
{void (*fp)(int);fp=test;    (*fp)(9);   //调用方式一:函数指针  fp(9);      //调用方式二:函数指示符return 0;
}void test(int a)
{printf( "%d\n", a );}输出结果:
9
9

这两种形式是等价的。

这是因为在 C/C++ 中总是使用函数指针的形式来调用函数。即使在函数调用中使用的是函数指示符(代表函数类型), 也会被转换为函数指针使用,这就是默认的 function-to-pointer 转换。

尽管二者等价,但个人还是比较推荐用函数指针的形式来调用函数。

二、结构体中的函数指针
函数指针可以作为结构体的成员使用。

void Dance_func(){printf("Xiao Ming is dancing!\n");
}void Sing_func(int i) {printf("Xiao Ming Sang %d Songs.\n", i);
}typedef struct {void (*dance)();   //函数指针的正确形式void (*sing)(int i);//void * sing (int i);  错误形式,无法通过编译
} student;int main(void)
{student Xiao_Ming;Xiao_Ming.dance = Dance_func; //对结构体变量的赋值。函数名Dance_func是指针Xiao_Ming.dance();            //调用Dance_func()Xiao_Ming.sing = Sing_func;   //同上Xiao_Ming.sing(3);return 0;
}输出结果:Xiao Ming is dancing!
Xiao Ming Sang 3 Songs.

结构体中的函数指针(c语言里一种思想)相关推荐

  1. 结构体自定义指针函数c语言,C语言结构体中的函数指针

    C语言结构体中的函数指针 C语言结构体中的函数指针内容由小编收集整理,希望对您的 学习有所帮助!更多内容请关注应届毕业生考试网! 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合.所以,标准 ...

  2. C语言中的指针应用,函数指针,指针函数,结构体中定义函数指针。

    指针函数 指针函数就是一个返回指针的函数,其本质是一个函数,该函数的返回值是一个指针. 声明一个指针函数 int* fun(int x,int y); 例子 typedef struct _Data{ ...

  3. 结构体自定义指针函数c语言,详解C语言结构体中的函数指针

    结构体是由一系列具有相同类型或不同类型的数据构成的数据集合.所以,标准C中的结构体是不允许包含成员函数的,当然C++中的结构体对此进行了扩展.那么,我们在C语言的结构体中,只能通过定义函数指针的方式, ...

  4. C语言结构体中定义函数指针详解

    C语言结构体中定义函数指针详解 结构体指针函数应用场景之一--驱动程序编写 结构体的一些基本用法 形式1:先定义结构体类型,再定义变量 形式2:在定义类型的同时定义变量 形式3:直接定义变量,用无名结 ...

  5. c语言 一个函数返回结构体指针,详解C语言结构体中的函数指针

    结构体是由一系列具有相同类型或不同类型的数据构成的数据集合.所以,标准C中的结构体是不允许包含成员函数的,当然C++中的结构体对此进行了扩展.那么,我们在C语言的结构体中,只能通过定义函数指针的方式, ...

  6. c语言中结构体类型定义的函数指针,结构体中定义函数指针

    结构体指针变量的定义 定义结构体变量的一般形式如下:形式1:先定义结构体类型,再定义变量struct 结构体标识符{ 成员变量列表;-};struct 结构体标识符 *指针变量名;变量初始化:stru ...

  7. 结构体中定义函数指针

    结构体指针变量的定义,定义结构体变量的一般形式如下: 形式1:先定义结构体类型,再定义变量 struct结构体标识符 { 成员变量列表;- }; struct 结构体标识符 *指针变量名; 变量初始化 ...

  8. C——结构体中的函数指针

    在学习驱动程序的时候,代码中常常看到各种结构体,结构体中也有各种函数指针.在这里复习一下结构体,以及指针函数.  结构体一般有以下几种形式的用法:  1.先定义结构类型再定义变量  如: struct ...

  9. c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...

    C 语言学习笔记[结构体02]结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之结构体指针变量一提指针,那可 是 C 语言的核心了,有多少学子曾拜倒在指针的脚下.单纯的说指针,其实并不难,但是 ...

最新文章

  1. 翻译器DIY它———算在英文文本中的单词数,字符和行数
  2. Android开发之Android5.1.1(CM12.1)源码中短信发送流程解析
  3. Composer The openssl extension is required for SSL/TLS protection
  4. linux crontab 每隔10秒执行一次
  5. ModuleNotFoundError: No module named 'tinymce
  6. 动词变名词的变化规则_动词过去式变化规则 - 点评英语网
  7. android 浏览器 div穿透,解决IE 上重叠div 对 mouseover 事件的穿透方法之一
  8. android studio控制台调试程序,Android Studio ADB网络调试汇总
  9. 谈谈考虑了多普勒的信道
  10. 【HDU - 3038】How Many Answers Are Wrong 【带权并查集 - 向量偏移】
  11. 兄弟打印机内存已满清零方法_兄弟打印机打印时显示内存已满怎么办
  12. 程序员学英语Oeasy
  13. Git出错,提示error: bad signature 0x00000000 fatal: index file corrupt(win10系统)
  14. 7000字爆肝!我把14个自学编程的压箱底网站全部分享给你们啦
  15. kobo glo原系统设置
  16. ueditor统计字数中文_百度UEditor修改右下角统计字数包含html样式
  17. 为什么VDI(桌面虚拟化)对于硬核UNIX/Linux工程应用程序是有意义的?
  18. Android桌面布局
  19. RISCV MMU 概述
  20. 数据安全--15--去标识化技术

热门文章

  1. 几种优化算法(求最优解)
  2. 分布式鲁棒优化初学1
  3. 在codecademy上学习Python
  4. 百度地图-设置地图最小、最大级别
  5. 中国农业科学院培训中心职业技能等级证书及培训证书
  6. 今天聊聊电商系统中红包活动设计
  7. 苹果耳机airpods2需要激活?_苹果耳机三兄弟,谁才是安卓手机的绝配?
  8. gaussdb200 实操
  9. C语言-输出一个菱形图。
  10. 事件监听机制(一)Java事件监听