指针的深入了解5

1.二维数组传参本质

在此之前我们学习了一维数组传参,传的是它的首元素地址。那么二维数组也是这样的吗?

我们来看一串代码:

void print(int(*pt)[5])
{for (int i = 0; i < 3; i++){for (int j = 0; j < 5; j++){printf("%d ", *(*(pt + i) + j));}printf("\n");}
}
int main()
{int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };print(arr);return 0;
}

在上述代码中我们使用了数组指针,如果二维数组传参也是首元素地址的话,那就是第一个一维数组的地址,我们就用int(*pt)[5]来接收传参,pt表示指向一个有5个整型元素的数组。这样的话我们将其解引用就得到了第一个一维数组,但是一维数组的名字又是首元素地址,所以我们再次解引用就得到了第一个一维数组的首元素,我们一次类推将其余元素打印出来。

我们来看看设想是否真确:

我们看到所有的元素都打印出来,所以我们的猜想的是对的。

2. 函数指针变量

我们之前学过数组指针所以函数指针也是指针,其实每个函数也有一个地址我们。

我们来看一串代码:

 这样看来函数名就是函数的地址,我们的函数指针是啥呢?也就是用来存放函数地址的地方。

上述代码中我们使用了指针变量pt它的类型为int(*)(int x,int y),这个其实就是函数指针,int表示指向函数的返回类型,*告诉我们pt是个指针变量,(int x,int y )是指向的函数参数类型,其中x,y可省略不写(int ,int)即可。

我们有了函数的地址就可以通过解引用找到函数。然后进行函数调用。

演示如下:

 我们通过解引用找到函数Add并且传参4,5,至Add函数,接收其返回值并打印出来。

3. typedef关键字

typedef是用来类型重命名的,可以将复杂的类型,简单化。比如,你觉得 unsigned int 写起来不方便,如果能写成 und_t 就方便多了,那么我们可以使用:

如果是指针类型,能否重命名呢?其实也是可以的,比如,将 int* 重命名为 ptr_t ,这样写:

但是对于数组指针和函数指针稍微有点区别:
比如我们有数组指针类型 int(*)[5] ,需要重命名为 parr_t ,那可以这样写: 

在这里我们重定义的数组指针类型要将重定义的名称写在*右边。

函数指针类型的重命名也是一样的,比如,将 void(*)(int) 类型重命名为 pf_t ,就可以这样写:

4.函数指针数组 

顾名思义当然是数组了,上面我们学习了函数指针,那啥时函数指针数组呢?

其实就是函数指针的数组,我们来看一串代码:

 我们创建了三个函数,它们的参数都是两个int类型,返回类型都为int,所以我们将它们是哪个函数的地址存入到函数指针数组中也就是int(*pt[3])(int x,int y),在这里int(*[3])(int x,int y)是类型。

在这里可以通过数组下标找到相应的函数进行运算,我们可以使用一个switch语句选择想要的的计算方法,就可以进行计算。

void menu()
{printf("*****************************\n");printf("****1.Add   2.Sub   *********\n");printf("****3.Mul   4.Div   *********\n");printf("****0.exit          *********\n");printf("*****************************\n");
}
int Add(int x, int y)
{return x + y;
}
int Sub(int x, int y)
{return x - y;
}
int Mul(int x, int y)
{return x * y;
}
int Div(int x, int y)
{return x / y;
}void cals(int (*pt)(int, int))
{int x, y = 0;int ret = 0;printf("请输入两个操作数:");scanf("%d %d", &x, &y);ret = pt(x, y);printf("%d\n", ret);}int main()
{int input = 0;do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:cals(Add);break;case 2:cals(Sub);break;case 3:cals(Mul);break;case 4:cals(Div);break;case 0:printf("退出计算器");break;default:printf("输入错误,请重新输入");}} while (input);
}

在这个代码中我们就完成了简单的计算器模拟实现。

谢谢

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

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

相关文章

Android P 屏保和休眠相关知识

Android P添加屏保功能&#xff0c;如果休眠时间设定大于屏保时间&#xff0c;则先进入屏保&#xff0c;达到休眠时间后再进入休眠 需求&#xff1a; 添加屏幕互保开关&#xff0c;默认关闭。只保留时钟&#xff0c;可设定指针和数字、夜间模式。启用时间改多长时间无操作进入…

【React教程】(3) React之表单、组件、事件处理详细代码示例

目录 事件处理示例1示例2示例3&#xff08;this 绑定问题&#xff09;示例4&#xff08;传递参数&#xff09;Class 和 Style 表单处理组件组件规则注意事项函数式组件&#xff08;无状态&#xff09;类方式组件&#xff08;有状态&#xff09;组件传值 Propsthis.props.childr…

docker-compose部署单机ES+Kibana

记录部署的操作步骤 准备工作编写docker-compose.yml启动服务验证部署结果 本次elasticsearch和kibana版本为8.2.2 使用环境&#xff1a;centos7.9 本次记录还包括&#xff1a;安装elasticsearch中文分词插件和拼音分词插件 准备工作 1、创建目录和填写配置 mkdir /home/es/s…

分表过多引起的问题/Apache ShardingSphere元数据加载慢

目录 环境 背景 探寻 元数据的加载策略 如何解决 升级版本到5.x 调大max.connections.size.per.query max.connections.size.per.query分析 服务启动阶段相关源码 服务运行阶段相关源码 受到的影响 注意事项&#xff08;重要&#xff09; 其他 环境 Spring Boot 2…

70从零开始学Java之Collection与Collections有什么区别?

作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 截止到现在,壹哥已经把Java里的List、Set和Map这三大集合都给大家讲解完毕了,不知道各位掌握了多少呢?如果你对之前的内容还没有熟练掌握,可以把壹哥前…

AI新工具(20240129) AI红包封面;Baichuan 3-超千亿参数的大语言模型;腾讯文档智能助手

AI红包封面-定制微信红包封面 AI红包封面生成器利用AI技术&#xff0c;为用户定制微信红包封面&#xff0c;生成精美作品。产品定位于为用户提供个性化、精美的微信红包封面定制服务。定价根据封面定制的复杂程度而定。 AI: Art Impostor-AI绘画多人联机休闲派对游戏 AI: Art…

计网Lesson12 - UDP客户服务器模型和UDP协议

文章目录 丢个图在这&#xff0c;实在不是很明白在讲啥&#xff0c;等学完网编的我归来狠狠拿下它

微信小程序如何搜索iBeacon设备

1.首先在utils文件夹下创建bluetooth.js和ibeacon.js 2.在 bluetooth.js文件中写入 module.exports {initBluetooth: function () {// 初始化蓝牙模块wx.openBluetoothAdapter({success: function (res) {console.log(蓝牙模块初始化成功);},fail: function (res) {console.l…

贪吃蛇项目

引言&#xff1a; 本文章使用C语言在Windows环境的控制台中模拟实现经典小游戏贪吃蛇。 实现基本功能&#xff1a; 1.贪吃蛇地图绘制。 2.蛇吃食物的功能&#xff08;上、下、左、右方向键控制蛇的动作&#xff09; 3.蛇撞墙死亡 4.蛇咬到自己死亡 5.计算得分 6.蛇加速…

Spark3内核源码与优化

文章目录 一、Spark内核原理1、Spark 内核概述1.1 简介1.2 Spark 核心组件1.3 Spark 通用运行流程概述 2、Spark 部署模式2.1 YARN Cluster 模式(重点)2.2 YARN Client 模式2.3 Standalone Cluster 模式2.4 Standalone Client 模式 3、Spark 通讯架构3.1 Spark 通信架构概述3.2…

【React教程】(2) React之JSX入门与列表渲染、条件渲染详细代码示例

目录 JSX环境配置基本语法规则在 JSX 中嵌入 JavaScript 表达式在 JavaScript 表达式中嵌入 JSXJSX 中的节点属性声明子节点JSX 自动阻止注入攻击在 JSX 中使用注释JSX 原理列表循环DOM Elements 列表渲染语法高亮 条件渲染示例1&#xff1a;示例2&#xff1a;示例3&#xff08…

Spring Security的入门案例!!!

一、导入依赖 <dependencies><!--web--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--security--><dependency><groupId>…