详解C语言结构体中的函数指针

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

函数指针

函数类型 (*指针变量名)(形参列表);第一个括号一定不能少。
“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少。
 注意指针函数与函数指针表示方法的不同,千万不要混淆。最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。
要声明一个函数指针,使用下面的语法:

Return Type ( * function pointer's variable name ) ( parameters )

例如声明一个名为func的函数指针,接收两个整型参数并且返回一个整型值

int (*func)(int a , int b ) ;

可以方便的使用类型定义运用于函数指针:

typedef int (*func)(int a , int b ) ;

结构体中的函数指针
我们首先定义一个名为Operation的函数指针:

typedef int (*Operation)(int a , int b );

再定义一个简单的名为STR的结构体

typedef struct _str {
    int result ; // 用来存储结果
    Operation opt; // 函数指针 

 } STR;

现在来定义两个函数:Add和Multi:

//a和b相加
int Add (int a, int b){
  return a + b ;
}
//a和b相乘
int Multi (int a, int b){
  return a * b ;
}

现在我们可以写main函数,并且将函数指针指向正确的函数:

int main (int argc , char **argv){
   STR str_obj;
   str_obj.opt = Add;  //函数指针变量指向Add函数
   str_obj. result = str_obj.opt(5,3);
   printf (" the result is %d\n", str_obj.result );
   str_obj.opt= Multi;  //函数指针变量指向Multi函数
   str_obj. result = str_obj.opt(5,3);
   printf (" the result is %d\n", str_obj.result );
   return 0 ;
}

运行结果如下:

 the result is 8
 the result is 15

完整的代码如下:

#include<stdio.h>

typedef int (*Operation)(int a, int b);
typedef struct _str {
  int result ; // to sotre the resut
  Operation opt; // funtion pointer
 } STR;

//a和b相加
int Add (int a, int b){
  return a + b ;
}

//a和b相乘
int Multi (int a, int b){
  return a * b ;
}

int main (int argc , char **argv){
   STR str_obj;
   str_obj.opt = Add;  //函数指针变量指向Add函数
   str_obj. result = str_obj.opt(5,3);
   printf ("the result is %d\n", str_obj.result );
   str_obj.opt= Multi;  //函数指针变量指向Multi函数
   str_obj. result = str_obj.opt(5,3);
   printf ("the result is %d\n", str_obj.result );
   return 0 ;
}
(0)

相关推荐

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

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

  • C语言中的函数指针基础学习教程

    顾名思义,函数指针就是函数的指针.它是一个指针,指向一个函数.看例子: A) char * (*fun1)(char * p1,char * p2); B) char * *fun2(char * p1,char * p2); C) char * fun3(char * p1,char * p2); 看看上面三个表达式分别是什么意思? C)这很容易,fun3是函数名,p1,p2是参数,其类型为char *型,函数的返回值为char *类型. B) 也很简单,与C)表达式相比,唯一不同的就是函数的

  • 深入解析C语言中函数指针的定义与使用

    1.函数指针的定义     函数是由执行语句组成的指令序列或者代码,这些代码的有序集合根据其大小被分配到一定的内存空间中,这一片内存空间的起始地址就成为函数的地址,不同的函数有不同的函数地址,编译器通过函数名来索引函数的入口地址,为了方便操作类型属性相同的函数,c/c++引入了函数指针,函数指针就是指向代码入口地址的指针,是指向函数的指针变量. 因而"函数指针"本身首先应该是指针变量,只不过该指针变量指向函数.这正如用指针变量可指向整形变量.字符型.数组一样,这里是指向函数.C在编译时

  • 深入学习C语言中的函数指针和左右法则

    通常的函数调用     一个通常的函数调用的例子: //自行包含头文件 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int main(int argc, char* argv[]) { MyFun(10); //这里是调用MyFun(10);函数 return 0; } void MyFun(int x) //这里定义一个MyFun函数 { printf("%d\n",x); } 这个MyFun函数是一个无返回值的函数,它并不完成

  • c语言:基于函数指针的两个示例分析

    第一个:------------------------------------------------------ 复制代码 代码如下: #include <stdio.h>#include <string.h>void tell_me(int f(const char *, const char *));int main(void){   tell_me(strcmp);   tell_me(main);   return 0;}void tell_me(int f(const

  • C++中函数指针详解及代码分享

    函数指针 函数存放在内存的代码区域内,它们同样有地址.如果我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,如同数组的名字就是数组的起始地址. 1.函数指针的定义方式:data_types (*func_pointer)( data_types arg1, data_types arg2, ...,data_types argn); c语言函数指针的定义形式:返回类型 (*函数指针名称)(参数类型,参数类型,参数类型,-); c++函数指针的定义形式:返回类型 (类名

  • 详解C语言结构体中的函数指针

    结构体是由一系列具有相同类型或不同类型的数据构成的数据集合.所以,标准C中的结构体是不允许包含成员函数的,当然C++中的结构体对此进行了扩展.那么,我们在C语言的结构体中,只能通过定义函数指针的方式,用函数指针指向相应函数,以此达到调用函数的目的. 函数指针 函数类型 (*指针变量名)(形参列表):第一个括号一定不能少. "函数类型"说明函数的返回类型,由于"()"的优先级高于"*",所以指针变量名外的括号必不可少.  注意指针函数与函数指针表示

  • 详解C语言结构体中的char数组如何赋值

    目录 前景提示 一.char数组类型的处理 1.结构体初始化 2.结构体内数据赋值(简单法) 二.char数组指针类型的处理 1.结构体初始化 2.结构体内数据赋值 3.结构体内输出数据 三.全部代码 1.char数组 2.char数组指针 总结 前景提示 定义一个结构体,结构体中有两个变量,其中一个是char类型的数组,那么,怎么向这个数组中插入数据,打印数据呢? typedef struct SequenceList { // 数组的元素 char element[20]; // 数组的长度

  • 详解C语言结构体,枚举,联合体的使用

    目录 一.匿名结构体 二.结构体的自引用 1.声明时不要自己引用自己 2.结构体重命名时不能使用重命名 三.结构体内存对齐规则 1.结构体内存计算 2.结构体嵌套 3.通过调整结构体成员顺序,压缩内存 四.存在内存对齐的原因 五.修改默认对齐数 六.结构体传参 七.位段 1.位段在内存中的存储 2.位段的跨平台问题 八.枚举 1.枚举的定义 2.枚举的优点 九.联合体(共用体) 1.联合体大小的计算 2.使用联合体判断计算机的大小端字节序 一.匿名结构体 struct { char name[2

  • 详解C语言结构体的定义和使用

    目录 1.1: 结构体用来干嘛? 1.2:结构体变量的基本定义格式 1.3:结构体变量的定义 1.4结构体变量的三种引用方法 2.结构体变量的使用(直接使用结构体变量) 2.1输出结果 3.使用结构体指针操作,返回总成绩最低的学生信息 3.1运行结果 总结: 1.1: 结构体用来干嘛? 生活中我们会遇到很多的表格,就比如你的学习成绩表,有姓名 ,学号,各科的成绩,总的成绩等等,这是一些不同的数据类型,我们要是在c语言中想同时使用这些不同的数据怎么办呢? 可以使用结构体变量,结构体变量在c语言中是

  • C语言结构体中内存对齐的问题理解

    目录 前言 思考 结构体在内存中开辟空间时内存对齐的规则 为什么存在内存对齐 1.平台的原因 2.性能的原因 前言 学C的同学应该知道~ 想精通C语言就不得不面对—指针与内存 续上次指针的进阶,这一章我来聊一聊C语言内存对齐的问题 学习结构体的你有没有注意过结构体向系统申请的内存为多少呢的 思考 #include<stdio.h> typedef struct s1 { char a; char b; int c; }s1; typedef struct s2 { char a; int c;

  • 详解Go语言如何利用高阶函数写出优雅的代码

    目录 前言 问题 白银 黄金 王者 总结 前言 go项目中经常需要查询db,按照以前java开发经验,会根据查询条件写很多方法,如: GetUserByUserID GetUsersByName GetUsersByAge 每一种查询条件写一个方法,这种方式对外是挺好的,对外遵循严格原则,让每个对外的方法接口是明确的.但是对内的话,应该尽可能的通用,做到代码复用,少写代码,让代码看起来更优雅.整洁. 问题 在review代码的时候,针对上面3个方法,一般写法是 func GetUserByUse

  • 详解C++调用Python脚本中的函数的实例代码

    1.环境配置 安装完python后,把python的include和lib拷贝到自己的工程目录下 然后在工程中包括进去 2.例子 先写一个python的测试脚本,如下 这个脚本里面定义了两个函数Hello()和_add().我的脚本的文件名叫mytest.py C++代码: #include "stdafx.h" #include <stdlib.h> #include <iostream> #include "include\Python.h&quo

  • 详解C语言面向对象编程中的封装

    目录 前言 一.面向对象基本概念 什么是对象? 对象与类 面向对象的编程方式 二.C语言实现面向对象 面向对象的三大特征 面向对象之封装 简介 代码实现–基础版 代码实现-进阶版 总结 前言 面向对象是一种思维方式,基本上用什么语言都是可以实现的.C语言的编程方式一般是面向过程的,但是也是可以实现面向对象的.对象是什么?什么又是面向对象?面向对象的三大特性又怎么实现,且听我细细道来. 一.面向对象基本概念 什么是对象? 此对象非彼对象,虽然有时候此对象又可以是你脑袋中的对象,那让我们从我们误解的

  • 详解C语言在STM32中的内存分配问题

    01.前言 不说废话,先上示例代码 uint8_t num_byte[4]; uint32_t num_word; const uint32_t num_word_const = 0x1234; uint32_t *point_heap; int main(void) { uint8_t num_byte_stack; static uint8_t num_byte_static; point_heap = (uint32_t *)malloc(4); *point_heap = 0x3421;

  • C语言结构体成员赋值的深拷贝与浅拷贝详解

    目录 浅拷贝 结构体中不存在指针成员变量时 结构体中存在指针成员变量时 深拷贝 结论 浅拷贝 C语言中的浅拷贝是指在拷贝过程中,对于指针型成员变量只拷贝指针本身,而不拷贝指针所指向的目标,它按字节复制的.我们分几种情况举例子来看一下. 结构体中不存在指针成员变量时 代码如下: #include <stdio.h> typedef struct { char name[64]; int age; }Member; int main(){ Member stu1 = { "LiMing&

随机推荐