2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 结构体中的函数指针(c语言里一种思想)

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

时间:2020-04-30 01:34:26

相关推荐

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

阅读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 );}输出结果:99

这两种形式是等价的。

这是因为在 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.

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。