C语言学习笔记--函数与指针
1. 函数类型
(1)C 语言中的函数有自己特定的类型,这个类型由返回值、参数类型和参数个数共同决定。如 int add(int i,int j)的类型为 int(int,int)。
(2)C 语言中通过 typedef 为函数类型重命名
typedef type name(parameter list);//如 typedef int f(int,int);
2. 函数指针
(1)函数指针用于指向一个函数,函数名是执行函数体的入口地址。
(2)定义函数指针的两种方法
①通过函数类型定义:FuncType* pointer;
②直接定义:type(*pointer)(parameter list);
其中 type 为返回值类型,pointer 为函数指针变量名,parameter list 为参数类型列表
#include <stdio.h> typedef int (FUNC)(int);
int test(int i)
{
return i * i;
} void f()
{
printf("Call f()...\n");
} int main()
{
FUNC* pt = test; //合法,函数名就是函数体的入口地址 //直接定义函数指针,&f是旧式写法。函数名只是一个符号(不是变量),
//与数组名一样,并不为其分配内存,因此&f和f在数值上是相等的。
void(*pf)() = &f; //如果知道某个函数的地址,这里可以改为一个固定的地址值,实现跳转! printf("pf = %p\n",pf);
printf("f = %p\n",f);
printf("&f = %p\n",&f); //结果应为:pf == f == &f; pf();//利用函数指针调用 (*pf)(); //旧式写法 printf("Function pointer call:%d\n",pt()); return ;
}
3. 回调函数
(1)回调函数是利用函数指针实现的一种调用机制
(2)回调机制原理
①调用者不知道具体事件发生时需要调用的具体函数
②被调函数不知道何时被调用,只知道需要完成的任务
③当具体事件发生时,调用者通过函数指针调用具体函数。
(3)回调机制中的调用者和被调用者互不依赖。
回调函数使用
#include <stdio.h> typedef int (*Weapon)(int); //操作某种武器的函数 //使用某种武器与boss进行战斗
void fight(Weapon wp,int arg) //arg为传给函数指针的参数
{
int result = ; printf("Fight boss!\n"); result = wp(arg);//调用回调函数,并传入参数arg printf("Boss loss:%d\n",result);//Boss失血多少?
} //使用武器——刀
int knife(int n)
{
int ret = ;
int i = ; for (i=; i< n; i++)
{
printf("Knife attack:%d\n",);
ret++;
} printf("\n"); return ret;
} //使用武器——剑
int sword(int n)
{
int ret = ;
int i = ; for (i=; i< n; i++)
{
printf("Sword attack:%d\n",);
ret++;
} printf("\n"); return ret;
} //使用武器——枪
int gun(int n)
{
int ret = ;
int i = ; for (i=; i< n; i++)
{
printf("Gun attack:%d\n",);
ret++;
} printf("\n"); return ret;
} int main()
{ fight(knife, );//用刀砍3次
fight(sword, );//用剑刺4次
fight(gun, ); //开枪5次 return ;
}
函数指针是实现回调机制的关键技术,通过函数指针可以在 C 程序中实现固定地址跳转
参考资料:
www.dt4sw.com
http://www.cnblogs.com/5iedu/category/804081.html
C语言学习笔记--函数与指针的更多相关文章
- Go语言学习笔记九: 指针
Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...
- C语言学习笔记--函数
1. C 语言中的函数 (1)函数的由来: 程序 = 数据 + 算法→C 程序 = 数据 + 函数 (2)模块化程序设计 (3)C 语言中的模块 2. 面向过程的程序设计 (1)面向过程是一种以过程为 ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 指针
每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址. #include <iostream> using namesp ...
- c语言学习笔记 函数数组传递笔记
今天学习c语言的一个小例子,果然还是陷入了php的编程习惯里,这里记录一下. #include <stdio.h> //例子很简单,就是编写一个函数把传递进来的数组里的值都赋值为1而已 / ...
- C语言学习笔记 (007) - 数组指针和通过指针引用数组元素的方法总结
1.数组指针:即指向数组的指针 那么, 如何声明一个数组指针呢? ]; /*括号是必须写的,不然就是指针数组:10是数组的大小*/ 拓展:有指针类型元素的数组称为指针数组. 2.通过指针引用数组元素的 ...
- C语言学习笔记 (001) - 常量指针与指针常量的区别(转帖)
三个名词虽然非常绕嘴,不过说的非常准确.用中国话的语义分析就可以很方便地把三个概念区分开. 一) 常量指针. 常量是形容词,指针是名词,以指针为中心的一个偏正结构短语.这样看,常量指针本质是指针,常量 ...
- Go语言学习笔记-函数部分(三)
函数部分 函数基本组成:关键字func.函数名.参数列表.返回值.函数体.返回语句 例子: func Add(int a, int b) (return int, err error){ ....函数 ...
- Go语言学习笔记七: 函数
Go语言学习笔记七: 函数 Go语言有函数还有方法,神奇不.这有点像python了. 函数定义 func function_name( [parameter list] ) [return_types ...
- 大一C语言学习笔记(5)---函数篇-定义函数需要了解注意的地方;定义函数的易错点;详细说明函数的每个组合部分的功能及注意事项
博主学习C语言是通过B站上的<郝斌C语言自学教程>,对于C语言初学者来说,我认为郝斌真的是在全网C语言学习课程中讲的最全面,到位的一个,这个不是真不是博主我吹他哈,大家可以去B站去看看,C ...
随机推荐
- BZOJ4199/UOJ131 [Noi2015]品酒大会
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- java集合转换成json时问题和解决方法
json+hibernate死循环问题的一点见解,有需要的朋友可以参考下. [问题]如题所示,在我们使用hibernate框架而又需要将对象转化为json的时候,如果配置了双向的关联关系,就会出现这个 ...
- 洛谷P1027 Car的旅行路线
洛谷P1027 Car的旅行路线 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速 ...
- java: i18n语言
<%@ page language="java" contentType="text/html; charset=utf8"%> <%@ pa ...
- VS2013打包安装(InstallShield Limited Edition for Visual Studio 2013 )
(1)百度文库安装步骤: http://wenku.baidu.com/link?url=B7NIE3gmoVx7UYUKigVGMjmINFIThpkH0DLXcYGx_9B1YzrX1QfHO2N ...
- web自动化:前端页面组成
一.web页面的组成 1. 常用:HTML + CSS + Javascript 2. HTML:定义页面的呈现内容 3. CSS:Cascading Style Sheets,层叠样式表 控制你的网 ...
- hdu4121 poj4001 Xiangqi(模拟)
模拟题考验coding能力,一定要思路清晰,按照模块化思想,有哪些情况,需要哪些功能都要事先分析好了.高手的模拟题代码往往结构很清晰,功能模块写成函数,没有过多重复代码,让人一看便明. 方法选择的好坏 ...
- BRICH
一.简介 Brich是典型的基于层次的聚类算法.最大的特点就是适合数据量特别大的数据集,处理速度很快,因为该算法扫描一遍数据集. 该算法是利用了一个树状结构来快速聚类,该结构类似平衡B+树.每一个叶子 ...
- Python函数-enumerate()
enumerate(sequence, [start=0]) 作用: 将可循环序列sequence以start开始分别列出序列数据和数据下标,即对一个可遍历的数据对象(如列表.元组或字符串),enum ...
- 洛谷【P1048】采药
浅谈\(DP\):https://www.cnblogs.com/AKMer/p/10437525.html 题目传送门:https://www.luogu.org/problemnew/show/P ...