c语言 一个函数返回结构体指针,详解C语言结构体中的函数指针
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。所以,标准C中的结构体是不允许包含成员函数的,当然C++中的结构体对此进行了扩展。那么,我们在C语言的结构体中,只能通过定义函数指针的方式,用函数指针指向相应函数,以此达到调用函数的目的。
函数指针
函数类型 (*指针变量名)(形参列表);第一个括号一定不能少。
“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少。
注意指针函数与函数指针表示方法的不同,千万不要混淆。最简单的辨别方式就是看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。
要声明一个函数指针,使用下面的语法:
1Return Type ( * function pointer's variable name ) ( parameters )
例如声明一个名为func的函数指针,接收两个整型参数并且返回一个整型值
1int (*func)(int a ,int b ) ;
可以方便的使用类型定义运用于函数指针:
1typedef int (*func)(int a ,int b ) ;
结构体中的函数指针我们首先定义一个名为Operation的函数指针:
1typedef int (*Operation)(int a ,int b );
再定义一个简单的名为STR的结构体
1
2
3
4
5typedef struct _str {
int result ;// 用来存储结果
Operation opt;// 函数指针
} STR;
现在来定义两个函数:Add和Multi:
1
2
3
4
5
6
7
8//a和b相加
int Add (int a,int b){
return a + b ;
}
//a和b相乘
int Multi (int a,int b){
return a * b ;
}
现在我们可以写main函数,并且将函数指针指向正确的函数:
1
2
3
4
5
6
7
8
9
10int 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 ;
}
运行结果如下:
1
2the result is 8
the result is 15
完整的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28#include
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 ;
}
c语言 一个函数返回结构体指针,详解C语言结构体中的函数指针相关推荐
- c语言数据类型int的用法,C语言基本数据类型:整型(int)用法详解|C语言学习
C语言基本数据类型:整型(int)用法详解 1. 整型 int C 语言提供了很多整数类型(整型),这些整型的区别在于它们的取值范围的大小,以及是否可以为负.int 是整型之一,一般被称为整型.以后, ...
- c++指针详解_c语言详解sizeof
一.sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等. 它并不是函数. sizeof操作符以字节形式给出了其操作数的存储大小. 操作数可以是一个表达式或括在括 ...
- c语言指针常量和常量指针,详解C语言中的常量指针和指针常量
概述对于新手来说,指针在c语言里总是一个非常难以理解的概念.在这篇文章中,我们将解释常量指针,指针常量,const pointer to const(ps:楼主以为这可以翻译成指向常量的常量指针)的区 ...
- deepdiff函数返回_Linux diff命令详解
diff(difference)命令常用来比较两个文件中的内容.diff 命令在最简单的情况下,比较两个文件的不同.如果使用"-"代替"文件"参数,则要比较的内 ...
- 详解RAI I、C++中的智能指针以及一些常见的面试题
RAII RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存.文件句柄.网络连接.互斥量等等)的简单技术. 用法 RA ...
- Python re 模块findall() 函数返回值展现方式详解
findall 函数: 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表. 注意: match 和 search 是匹配一次 findall 匹配所有,mat ...
- 详解c语言main函数、printf函数、scanf函数与va家族
C语言入门与提升(1)--详解c语言main函数.printf函数与scanf函数,与va家族 前言: 为什么要学习C语言呢?C语言作为最古老的语言之一,走过了半个多世纪的风风雨雨,至今仍然长盛不衰, ...
- 一个获取ip地址的命令详解
今天在看师兄写的一个安装脚本文件,虽然之前学了不少bash知识.不是太熟练,打算练练手,可是这个命令折磨了我好久.索性花点时间把它弄清楚.awk这个工具语言的难度,我是体会到了.写正则表达式的都是什么 ...
- mysql安装后目录介绍,MySQL安装后的目录结构及配置文件详解
MySQL安装后的目录结构及配置文件详解 MySQL安装后的目录结构及配置文件详解 MySQL目录结构说明 MySQL 安装完成后,会在磁盘上生成一个目录,该目录就被称为 MySQL 的安装目录. M ...
最新文章
- Gerrit评审报错[remote rejected] develop- refs/for/develop(no new changes)
- Excel 2013中单元格添加下拉列表的方法
- Luogu P1031 均分纸牌(贪心)
- 基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作
- 躺赚的意思不是做到高级别就觉得高枕无忧了
- SpringBoot的自定义配置方法一,通过自定义配置文件
- iOS开发中的HTML解析
- JavaScript表单验证年龄
- Django models Fild详解
- Day77_Flink(三)Flink时间语义和水印
- python调用gpu amd_TensorFlow使用AMD GPU实现加速(ROCm/Ubuntu 18.04)
- Python3开启自带http服务
- 【大规模MIMO学习笔记】大规模MIMO的信道特点
- 正则表达式行尾行首添加字符
- django操作word全程实录讲解(包含操作图片,内含代码下载地址)
- 【简约而不简单:神级代码的小秘密】| 第二章 栈
- 2017下半年软件测评师上午考试试题
- SQL service基础(九)用户定义数据类型和用户定义函数的概念、创建及使用方法
- Java异常(漂亮简洁的思维导图)
- 使用Python批量下载哨兵一号(sentinel-1)的精密轨道数据(precise orbit data)
热门文章
- AI 考生挑战高考作文,平均 1 秒生成 1 篇,水平超 75% 考生
- 在字节跳动工作是怎样的?
- 推荐免费收录外链的分类目录网站
- SOA推动电信服务走向融合应用
- c#和Python交互,完美解决Python调用OpenCV等第三方库以及分发时需配置python环境的问题
- 记录一次大学生受电话诈骗过程
- python中student和student_理解Python中的类与实例
- springcloud用feign消费服务记录
- JAVA培训班出来之后的面试经历
- Zeitgeist 2010: How the world searched - China (中国)