深入理解指针(7)函数指针变量及函数数组(文章最后放置本文所有原码)

一、函数指针变量

什么是函数指针变量呢?

既然是指针变量,那么它指向的一定是地址,而且我们可以通过地址来调用函数的。

函数是否有地址呢?地址是什么?

经过上面的测试可以看到函数也是有地址的,而且其地址就是函数名(当前是x86环境,这样地址值相对较短更容易分辨)。

1、函数地址的存储

与数组相似,函数的地址存储也是需要使用指针变量来进行存储的。

这里是结果

006F13CA
006F13CA

经过我们上面的代码演示可以看到函数的地址已经被指针p存储了起来,那我们该如何使用他们呢?

2、函数地址的使用

同样我们使用一个代码来清晰的解释如何使用这个话题:

可以看到我们在这里仅使用指针就可以对函数进行访问并使用(提一嘴int(*p)(int, int) = Add;这里的(int,int)可以在后面加上变量,但是不加减少了变量的创建同时也使得代码更简洁)。

我们根据上面以及之前所学习到的所有知识来看下面两段代码(出自《C陷阱和缺陷》这本书):

(*(void (*)())0)();

看到这是不是有点蒙?没关系我来给你逐词解释一下(首先说明这段代码是不可以运行的):

不知道大家对此能否理解呢?

我们来看另外一个:

void (*signal(int , void(*)(int)))(int);

如果可以理解上面的话,下面这段就可以很容易理解了吧!(还是给大家解释一下)

二、typedef关键字

简单说这个关键字的意思就是:重定义一个类型的名字。

例如:

这两个a,b都使用%d 的格式来进行打印,都是没有问题的,但是好像没什么用啊?

其实对于当前代码量较少,类型也比较简单的状态确实没有什么用处,但是当后期学习的更多了就能明白这个的重要性了,比如一个很长的代码中,我们要将其中所有的int类型的数据改成double类型,此时我们只需要在上面进行更改即可,一次更改后面的所有的int类型的数据都会更改为double类型,就不需要再一个一个慢慢的改了!

这个typedef关键字在对函数指针和指针数组在更改时是有所不同的:

在对指针数组和函数指针进行重定义时需要将重定义后的类型放在*的右面。

三、函数指针 数组

要把函数的地址存放到一个数字中,那这个数组就叫函数指针数组,那函数指针的数组怎么定义呢?

int (*parr1[3])();

这就是它的定义,怎么理解呢?

parr1先和[]结合,说明parr1是数组,数组的内容是什么呢?是int(*)()类型的函数指针。

以下就是本文的所有代码了,需要的朋友自取哦!

制作不易,请点个赞再走吧。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>//void test()
//{
//
//}
//int Add(int x, int y)
//{
//	return x + y;
//}
//int main()
//{
//	int x = 0, y = 0;
//	Add(x,y);
//	//这里要将解引用操作符和p使用括号括起来,主要目的是明确优先级和避免歧义
//	int(*p)(int, int) = Add;
//	printf("%p\n", p);
//	printf("%p\n", &Add);
//	//printf("%p\n", test);
//	//printf("%p\n", &test);
//	return 0;
//}
//int Add(int x, int y)
//{
//	return x + y;
//}
//int main()
//{
//	int(*p)(int, int) = Add;
//	printf("%d\n", p(2, 3));
//	printf("%d\n", (*p)(2, 3));
//	(*(void (*)())0)();
//	void (*signal(int, void(*)(int)))(int);
//	return 0;
//}//typedef int INT;
//typedef int(*arr_t)[5];
//typedef int(*ptr_t)(int);
//int p1(int a)
//{
//
//}
//ptr_t p2(int a)
//{
//
//}
//int main()
//{
//	//int a = 0;
//	//INT b = 3;
//	int* arr[] = { 0 };
//	arr_t n[] = { 0 };
//	printf("%d\n", arr[0]);
//	printf("%d\n", n[0]);
//	printf("%p\n", p1);
//	printf("%p\n", p2);
//	//printf("%d\n", a);
//	//printf("%d\n", b);
//	return 0;
//}int main()
{int (*parr1[3])(); //parr1 先和[] 结合,说明 parr1是数组,数组的内容是什么呢?是 int (*)() 类型的函数指针。return 0;
}

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

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

相关文章

每日一练 两数相加问题(leetcode)

原题如下&#xff1a; 这道题目是一道链表题&#xff0c;我们对于这种链表类&#xff0c;很显然我们最后输出的是初始节点&#xff0c;所以我们要保留我们的初始头指针&#xff0c;那么我们的第一步一定是把头指针保留一份&#xff0c;然后再让头指针往后进行操作。那么我们进行…

基于Axios封装请求---防止接口重复请求解决方案

一、引言 前端接口防止重复请求的实现方案主要基于以下几个原因&#xff1a; 用户体验&#xff1a;重复发送请求可能导致页面长时间无响应或加载缓慢&#xff0c;从而影响用户的体验。特别是在网络不稳定或请求处理时间较长的情况下&#xff0c;这个问题尤为突出。 服务器压力…

android安卓餐厅点餐课设

一、引言 随着移动互联网的快速发展&#xff0c;手机应用已经成为我们日常生活中不可或缺的一部分。餐饮行业也积极借助移动应用的力量&#xff0c;提供更便捷、高效的点餐服务。本文将介绍一个基于安卓系统开发的餐厅点餐APP的课程设计项目&#xff0c;探讨其设计理念、功能特…

【容器源码篇】Map容器(HashTable,HashMap,TreeMap的特点)

文章目录 ⭐容器继承关系&#x1f339;Map容器&#x1f5d2;️HashTable源码解析构造方法put方法remove方法rehash扩容 &#x1f5d2;️HashMap源码解析构造函数get方法put方法详解 扩容方法详解 &#x1f5d2;️TreeMap源码解析 ⭐容器继承关系 &#x1f339;Map容器 键值对映…

如何在 Mac 上打开、编辑、复制、移动或删除存储在 Windows NTFS 格式 USB 驱动器上的文件 Tuxera NTFS for Mac使用教程

当您获得一台新 Mac 时&#xff0c;它只能读取 Windows NTFS 格式的 USB 驱动器。要将文件添加、保存或写入您的 Mac&#xff0c;您需要一个附加的 NTFS 驱动程序。Tuxera 他可以帮忙实现这一功能&#xff01; Tuxera可以轻松转换驱动器&#xff1a;无论使用Windows PC还是Mac&…

OpenGL的MVP矩阵理解

OpenGL的MVP矩阵理解 右手坐标系 右手坐标系与左手坐标系都是三维笛卡尔坐标系&#xff0c;他们唯一的不同在于z轴的方向&#xff0c;如下图&#xff0c;左边是左手坐标系&#xff0c;右边是右手坐标系 OpenGL中一般用的是右手坐标系 1.模型坐标系&#xff08;Local Space&…

42 ajax 下载文件未配置 responseType blob 导致的文件异常

前言 这是一个最近的关于文件下载碰到的一个问题 主要的情况是, 基于 xhr 发送请求, 获取下载的文件 然后 之后 xhr 这边拿到 字节序列之后, 封装 blob 来进行下载 然后 最开始我们这边没有配置 responseType 为 blob, arraybuffer, 然后 导致下载出来的 文件大小超过了…

Image-Adaptive YOLO for Object Detection in Adverse Weather Conditions(IA-YOLO)

1、总体概述 基于深度学习的目标检测在常规条件的数据集可以获得不错的结果&#xff0c;但是在环境、场景、天气、照度、雾霾等自然条件的综合干扰下&#xff0c;深度学习模型的适应程度变低&#xff0c;检测结果也随之下降&#xff0c;因此研究在复杂气象条件下的目标检测方法…

警务数据仓库的实现

目录 一、SQL Server 2008 R2&#xff08;一&#xff09;SQL Server 的服务功能&#xff08;二&#xff09;SQL Server Management Studio&#xff08;三&#xff09;Microsoft Visual Studio 二、创建集成服务项目三、配置“旅馆_ETL”数据流任务四、配置“人员_ETL”数据流任…

k8s安装traefik作为ingress

一、先来介绍下Ingress Ingress 这个东西是 1.2 后才出现的&#xff0c;通过 Ingress 用户可以实现使用 nginx 等开源的反向代理负载均衡器实现对外暴露服务&#xff0c;以下详细说一下 Ingress&#xff0c;毕竟 traefik 用的就是 Ingress 使用 Ingress 时一般会有三个组件: …

基于SSM的高校普法系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的高校普法系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

inkscape中文版本 G代码生成器(支持中英文及数字)使用

inkscape G代码生成器&#xff08;支持中英文及数字&#xff09;使用 1 inkscape安装1. 界面介绍2. 基本操作3. 图形编辑4. 图层管理5. 文件操作6. 高级功能7. 学习资源 2 laserengraver插件安装3 inkscape 使用candle 验证G代码效果 1 inkscape安装 跟着提示默认按键即可。 软…

HTML网站的概念

目录 前言&#xff1a; 1.什么是网页&#xff1a; 2.什么是网站&#xff1a; 示例&#xff1a; 3.服务器&#xff1a; 总结&#xff1a; 前言&#xff1a; HTML也称Hyper Text Markup Language&#xff0c;意思是超文本标记语言&#xff0c;同时HTML也是前端的基础&…

Linux 环境安装Nginx—源码和Dokcer两种安装方式

一、源代码编译安装Nginx 1.下载最新nginx源码 以nginx-1.25.3.tar.gz为例&#xff1a; 可以使用命令(联网)&#xff1a;curl -O http://nginx.org/download/nginx-1.25.3.tar.gz或在官网下载.tar.gz 2.解压缩 tar -zxvf nginx-1.25.3.tar.gz cd nginx-1.25.3/ 3.安装依赖…

HarmonyOS实战开发-实现自定义弹窗

介绍 本篇Codelab基于ArkTS的声明式开发范式实现了三种不同的弹窗&#xff0c;第一种直接使用公共组件&#xff0c;后两种使用CustomDialogController实现自定义弹窗&#xff0c;效果如图所示 相关概念 AlertDialog&#xff1a;警告弹窗&#xff0c;可设置文本内容和响应回调…

【javaWeb 第八篇】后端-Mybatis(万字详细学习)

Mybatis框架 前言MybatisMybatis入门配置SQL提示JDBC数据库连接池lombok Mybatis基础操作日志输出Mybatis的动态SQL 前言 这篇是作者学习数据持久层框架Mybatis的学习笔记&#xff0c;希望对大家有所帮助&#xff0c;希望大家能够与作者交流讨论 Mybatis Mybatis是一款优秀的…

Android 开发 Spinner setSelection 不起作用

问题 Android 开发 Spinner setSelection 不起作用 详细问题 笔者进行Android项目开发&#xff0c;根据上一个页面用户选择数据&#xff0c;显示当前页面Spinner选项&#xff0c;调用 Spinner setSelection 不起作用。 相关java代码 spinner.setAdapter(adapter); …

uniapp对接萤石云 实现监控播放、云台控制、截图、录像、历史映像等功能

萤石云开发平台地址&#xff1a;文档概述 萤石开放平台API文档 (ys7.com) 萤石云监控播放 首先引入萤石云js js地址&#xff1a;GitHub - Ezviz-OpenBiz/EZUIKit-JavaScript-npm: 轻应用npm版本&#xff0c;降低接入难度&#xff0c;适配自定义UI&#xff0c;适配主流框架 vi…

C语言例4-35:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡、问鸡翁、鸡母和鸡雏各几何?

方法一&#xff1a; 代码如下&#xff1a; //鸡翁一&#xff0c;值钱五&#xff1b;鸡母一&#xff0c;值钱三&#xff1b;鸡雏三&#xff0c;值钱一。百钱买百鸡、问鸡翁、鸡母和鸡雏各几何&#xff1f; //方法一&#xff1a; #include<stdio.h> int main(void) {int x…

简易挛生分拣系统设计

1 工效组合展示 2 方案规划设计 3 数字挛生建模 基础建模、动画设计、模型导出 4 软件体系架构 5 Web交互设计 5.1 页面架构 5.2 初始构造 5.3 模型运用 5.4 WS通信 5.5 运行展现 6 服务支撑编码 6.1 整体调度 6.2 WS服务 6.3 C/S通信 7 系统级调试完善