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(2));return 0;
}

3. 回调函数

(1)回调函数是利用函数指针实现的一种调用机制

(2)回调机制原理

    ①调用者不知道具体事件发生时需要调用的具体函数

    ②被调函数不知道何时被调用,只知道需要完成的任务

    ③当具体事件发生时,调用者通过函数指针调用具体函数。

(3)回调机制中的调用者和被调用者互不依赖。

回调函数使用

#include <stdio.h>typedef int (*Weapon)(int); //操作某种武器的函数//使用某种武器与boss进行战斗
void fight(Weapon wp,int arg) //arg为传给函数指针的参数
{int result = 0;printf("Fight boss!\n");result = wp(arg);//调用回调函数,并传入参数arg
printf("Boss loss:%d\n",result);//Boss失血多少?
}//使用武器——刀
int knife(int n)
{int ret = 0;int i = 0;for (i=0; i< n; i++){printf("Knife attack:%d\n",1);ret++;}printf("\n");return ret;   
}//使用武器——剑
int sword(int n)
{int ret = 0;int i = 0;for (i=0; i< n; i++){printf("Sword attack:%d\n",5);ret++;}printf("\n");return ret;   
}//使用武器——枪
int gun(int n)
{int ret = 0;int i = 0;for (i=0; i< n; i++){printf("Gun attack:%d\n",10);ret++;}printf("\n");return ret;   
}int main()
{fight(knife, 3);//用刀砍3次fight(sword, 4);//用剑刺4次fight(gun, 5);  //开枪5次return 0;
}

函数指针是实现回调机制的关键技术,通过函数指针可以在 C 程序中实现固定地址跳转

 

参考资料:
www.dt4sw.com
http://www.cnblogs.com/5iedu/category/804081.html

转载于:https://www.cnblogs.com/CoderTian/p/5911451.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286039.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言试题五十七之假定输入的字符串中只包含字母和*号。请编写函数function,它的功能是:删除字符串中所有*号。在编写函数时,不得使用c语言提供的字符串函数。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 假定输入的…

Wordpress:将图片、post等的URL转换为相对路径

2019独角兽企业重金招聘Python工程师标准>>> 例如上传一张图片&#xff0c;其地址是可能 http://127.0.0.1/wp-content/uploads/2015/12/1_.png&#xff0c; 问题是如果我们通过其他的电脑通过wordpress主机的公网IP访问这张图片时会提示找不到。 最好的处理方法是不…

MySQL数据库的优化(下)MySQL数据库的高可用架构方案

【51CTO独家特稿】如果单MySQL的优化始终还是顶不住压力时&#xff0c;这个时候我们就必须考虑MySQL的高可用架构(很多同学也爱说成是MySQL集群)了&#xff0c;目前可行的方案有&#xff1a;一、MySQL Cluster 优势&#xff1a;可用性非常高&#xff0c;性能非常好。每份数据至…

【MATLAB统计分析与应用100例】案例018:matlab读取Excel数据,进行K均值聚类分析

文章目录 1. K均值聚类分析结果2. matlab完整代码(1)读取数据,并进行标准化变换(2)选取初始凝聚点,进行聚类(3)绘制轮廓图1. K均值聚类分析结果 2. matlab完整代码 (1)读取数据,并进行标准化变换 [X, textdata] = xlsread(examp09_04.xls

C# 扩展object类 将string强制转换成int

扩展代码&#xff1a; public static class ClassExtend{/// <summary>/// 将object强制转化为int/// </summary>/// <param name"o">要强制转换的object</param>/// <param name"defaultValue">o为null或者转换失败的默认值…

Android之华为手机打开app奔溃提示java.io.FileNotFoundException: res/drawable/abc_vector_test.xml

1、问题 新建立的项目,华为手机运行起来提示如下 06-24 18:24:03.175 13314 13314 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.appsinnova.android.booming/com.appsinnova.android.picper.MainActivity}: android.content…

CSS 零基础到实战(05)布局、盒子模型、弹性盒子【前端就业课 第二阶段】

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 一、流动布局 流动布局有3种布局模型&#xff0c;分别是流动布局&…

DVWA系列之24 high级别上传漏洞

最后再来分析high级别的代码&#xff1a;这里首先有一条语句需要理解&#xff1a;$uploaded_ext substr($uploaded_name, strrpos($uploaded_name, .) 1);在这条语句里&#xff0c;首先利用strrpos() 函数来查找“.”在变量$uploaded_name中出现的位置&#xff0c;然后将得到…

WPF 基础控件之 TreeView 样式

其他基础控件1.Window2.Button3.CheckBox4.ComboBox5.DataGrid 6.DatePicker7.Expander8.GroupBox9.ListBox10.ListView11.Menu12.PasswordBox13.TextBox14.RadioButton15.ToggleButton16.Slider TreeView 实现下面的效果1&#xff09;TreeView来实现动画&#xff1b;Grid 分两…

CSS文本样式

装饰&#xff1a; text-decoration&#xff1a;line-through&#xff08;贯穿线&#xff09;&#xff0c;underline&#xff08;下划线&#xff09;&#xff0c;overline&#xff08;上划线&#xff09; 对齐&#xff1a; text-align&#xff1a;center&#xff08;居中&#x…

利用系统错误日志监控磁盘健康状况

一、故障现象 这个星期出现了两块磁盘不能读写&#xff0c;后面通过系统日志查看&#xff0c;关键字“EXT4-fs error对应某个磁盘”&#xff0c;因此利用zabbix&#xff0c;把系统日志抓取出来&#xff0c;作告警&#xff01; 二、步聚 1.机器太多&#xff0c;用到ansible的pla…

【MATLAB统计分析与应用100例】案例019:matlab读取Excel数据,进行K均值聚类分析

文章目录 1. 读取数据,并进行标准化变换2. 进行模糊C均值聚类3. 查看聚类结果4. K均值聚类分析结果1. 读取数据,并进行标准化变换 % 从文件examp09_05.xls中读取数据 [xdata,textdata] = xlsread(examp09_05.xls); % 提取元胞数组textdata第1列的第4行至最后一行,即城市名称…

HTML Animation 【前端就业课 第二阶段】CSS 零基础到实战(06)

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 一、Animation 基础 使用 Animation 可以设置帧动画&#xff0c;与 tr…

史上最全的Visual Studio Code安装C/C++环境,若不行头砍给你。

一、下载Visual Studio Code安装 下载链接地址 二、安装C/C++插件 输入c/c++, 然后点击那里install 三、下载MinGW配置环境变量 下载地址 进入网站后不要点击 "Download Lasted Version",往下滑,找到最新版的 "x86_64-posix-seh"。

C# 11 新特性:泛型 Attribute

之前使用JsonConverterAttribute&#xff0c;我们可以为任意类型自定义 Json 序列化。例如&#xff1a;[JsonConverter(typeof(UserJsonConverter))] public class User {public string Name { get; set; }public override string ToString(){return Name;} }public class User…

highcharts动态获取数据生成图表问题

动态获取数据说白点就是从后台传值到前台&#xff0c;前台把这些值赋值给x轴与y轴&#xff08;这里指的是你X轴与Y轴都是变化的数据&#xff0c;如果你的X轴是固定的&#xff0c;像时间等等的那就另说&#xff09;。 柱状图的动态传值&#xff1a; //获取后台数据var x [];//…

【MATLAB统计分析与应用100例】案例020:matlab从相关系数矩阵出发进行主成分分析

文章目录 1. 定义相关系数矩阵PHO2. 调用pcacov函数根据相关系数矩阵作主成分分析3. 为了更加直观,以元胞数组形式显示结果4. 以元胞数组形式显示主成分表达式1. 定义相关系数矩阵PHO PHO = [1 0.79 0.36 0.76 0.25 0.510.79 1 0.31 0.55 0.17 …

NA-NP-IE系列实验实验15:RIPv2 手工汇总

实验15&#xff1a;RIPv2 手工汇总1.实验目的 通过本实验可以掌握&#xff1a;&#xff08;1&#xff09;RIPv2 路由的手工汇总&#xff08;2&#xff09;RIPv2 不支持CIDR 汇总&#xff08;3&#xff09;RIPv2 可以传递CIDR 汇总2.拓扑结构 实验拓扑如图 所示。3.实验步骤 路由…

CSS3 做一个旋转的立体3D正方形 动效核心【前端就业课 第二阶段】CSS 零基础到实战(07)

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 一、transform-origin transform-origin 用于更改当前元素的中心点&am…

Java 数字相关操作通用类 NumberUtils.java

package com.*.*.*.utils;import java.math.BigDecimal; import java.math.BigInteger; import java.math.RoundingMode; import java.text.DecimalFormat; import java.util.regex.Matcher; import java.util.regex.Pattern;public class NumberUtils {/**可重复使用的Long常量…