栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C语言】结构体中的函数指针

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【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( "%dn", 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.

注意:

  Xiao_Ming.dance = Dance_func; //对结构体变量的赋值。函数名Dance_func是指针
  Xiao_Ming.dance();            //调用Dance_func()

 二者只相差一个括号,但是意义不同。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/883091.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号