指针的深入了解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);
}

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

谢谢

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

bert提取词向量比较两文本相似度

使用 bert-base-chinese 预训练模型做词嵌入&#xff08;文本转向量&#xff09; 模型下载&#xff1a;bert预训练模型下载-CSDN博客 参考文章&#xff1a;使用bert提取词向量 下面这段代码是一个传入句子转为词向量的函数 from transformers import BertTokenizer, BertMod…

2024年了,是谁还在学C++11?(没错,是我)

今天要聊的这本书&#xff0c; 是真正畅行全球20年的C入门必读经典&#xff0c;各版本全球总销量超1300万册&#xff01; 它惠及了数百万高校师生&#xff0c;启蒙了5代国产程序员&#xff0c; 令全球数千万C开发者全部为之疯狂的大&#xff01;师&#xff01;名&#xff01…

实现Crm系统的灵活配置,满足不同行业客户需求

目录 一&#xff1a;数据模型配置 二&#xff1a;流程配置 三&#xff1a;扩展性配置 实现CRM系统的可配置性需要关注以下几个方面&#xff1a; 一&#xff1a;数据模型配置 为了满足企业的个性化需求&#xff0c;CRM系统需要提供灵活的数据模型配置。用户可以根据自己的业…

秋招面试—计算机网络安全

2021 计算机网络安全 1.Get 和 Post 的区别 get 用于获取数据&#xff0c;post用于提交数据&#xff1b; get 的缓存保存在浏览器和web服务器日志中&#xff1b; get 使用明文传输&#xff0c;post请求保存在请求体中&#xff1b; get 长度限制在2048以内 2.常见的HTTP请…

CVE-2024-0352 likeshop v2.5.7文件上传漏洞分析

本次的漏洞研究基于thinkPHP开发开的一款项目..... 漏洞描述 Likeshop是Likeshop开源的一个社交商务策略的完整解决方案&#xff0c;开源免费版基于thinkPHP开发。Likeshop 2.5.7.20210311及之前版本存在代码问题漏洞&#xff0c;该漏洞源于文件server/application/api/contr…

pytest教程-8-用例参数化方法

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节中我们学习了pytest用例前后置方法的使用&#xff0c;本小节我们讲解一下pytest用例的参数化方法。 参数化简介&#xff1a; 参数化测试是指在测试用例中通过传入不同的参数来运行多次测试&#xff0c;…

图像复原的天花板在哪里?SUPIR:开创性结合文本引导先验和模型规模扩大

SUPIR&#xff08;Scaling-UP Image Restoration&#xff09;&#xff0c;这是一种开创性的图像复原方法&#xff0c;利用生成先验和模型扩大规模的力量。通过利用多模态技术和先进的生成先验&#xff0c;SUPIR在智能和逼真的图像复原方面取得了重大进展。作为SUPIR中的关键催化…

纵向拼接,一键高效,让图片处理更简单!

你是否曾经因为需要批量处理图片而感到烦恼&#xff1f;现在&#xff0c;有了我们的图片处理工具&#xff0c;你可以轻松地纵向拼接图片&#xff0c;一键批量处理&#xff0c;让图片处理工作更加高效&#xff01;这款工具采用先进的技术&#xff0c;能够快速准确地完成图片纵向…

Android SystemUI 介绍

目录 一、什么是SystemUI 二、SystemUI应用源码 三、学习 SystemUI 的核心组件 四、修改状态与导航栏测试 本篇文章&#xff0c;主要科普的是Android SystemUI &#xff0c; 下一篇文章我们将介绍如何把Android SystemUI 应用转成Android Studio 工程项目。 一、什么是Syst…

大数据 - Spark系列《一》- 分区 partition数目设置详解

目录 &#x1f436;3.2.1 分区过程 &#x1f436;3.2.2 SplitSize计算和分区个数计算 &#x1f436;3.2.3 Partition的数目设置 1. &#x1f959;对于数据读入阶段&#xff0c;输入文件被划分为多少个InputSplit就会需要多少初始task. 2. &#x1f959;对于转换算子产生的…

在centos 7 中安装配置Jdk、Tomcat、及Tomcat自启动

目录 一、安装配置Jdk 1.创建目录并上传文件 2.解压JDK压缩包 3.配置JDK环境变量 4.设置环境变量生效 二、安装配置Tomcat 1.上传Tomcat并解压 2.启停Tomcat 3.修改tomcat-user.xml配置 4.配置远程访问Tomcat 5.远程项目发布 三.Tomcat自启动配置 1.配置Tomcat自启…

imx6ull学习记录(一)

这一块主要是了解linux系统驱动部分&#xff0c;编译镜像相关的知识&#xff0c;这里记录一下。 使用板子如下&#xff1a; 教程用的这一个版本&#xff1a; 1、基本环境搭建 这个比较简单&#xff0c;只是注意一下就是正点原子的教程用了一个NFS文件系统&#xff0c;简单来…

MongoDB介绍及安装

文章目录 MongoDB介绍什么是MongoDBMongoDB技术优势MongoDB应用场景 MongoDB快速开始linux安装MongoDB启动MongoDB Server关闭MongoDB服务 Mongo shell使用mongo shell常用命令数据库操作集合操作 安全认证创建管理员账号常用权限创建应用数据库用户 Docker安装MongoDB工具官方…

物流平台如何与电商平台进行自动化流程管理

为什么要实现物流与电商平台进行自动化管理 实现物流平台与电商平台的自动化流程管理对企业和消费者都有着重要的意义&#xff0c;比如以下几点&#xff1a; 提高效率&#xff1a;自动化流程管理可以减少人为操作的错误和延误&#xff0c;提高订单处理和物流配送的效率。通过定…

What is Rust? Why Rust?

why Rust&#xff1f; 目前&#xff0c;Rust 变得越来越流行。然而&#xff0c;仍然有很多人&#xff08;和公司&#xff01;&#xff09;误解了 Rust 的主张价值是什么&#xff0c;甚至误解了它是什么。在本文中&#xff0c;我们将讨论 Rust 是什么以及为什么它是一种可以增强…

Pytest单元测试框架

第一章、pytest概述 Pytest is a framework that makes building simple and scalable tests easy. Tests are expressive and readable—no boilerplate code required. Get started in minutes with a small unit test or complex functional test for your application or l…

Linux提权:Docker组挂载 Rsync未授权 Sudo-CVE Polkit-CVE

目录 Rsync未授权访问 docker组挂载 Sudo-CVE漏洞 Polkit-CVE漏洞 这里的提权手法是需要有一个普通用户的权限&#xff0c;一般情况下取得的webshell权限可能不够 Rsync未授权访问 Rsync是linux下一款数据备份工具&#xff0c;默认开启873端口 https://vulhub.org/#/envir…

第九节HarmonyOS 常用基础组件17-ScrollBar

1、描述 滚动条组件ScrollBar&#xff0c;用于配合可滚动组件使用&#xff0c;如List、Grid、Scroll。 2、接口 可包含子组件 ScrollBar(value:{scroller:Scroller, direction?: ScrollBarDirection, state?: BarState}) 3、参数 参数名 参数类型 必填 描述 scrolle…

148基于matlab的带有gui的轮轨接触几何计算程序

基于matlab的带有gui的轮轨接触几何计算程序,根据不同的踏面和轨头&#xff0c;计算不同横移量下面的接触点位置。程序已调通&#xff0c;可直接运行。 148 matlab 轮轨接触 横移量 (xiaohongshu.com)

Android App开发基础(2)—— App的工程结构

本专栏文章 上一篇 Android开发修炼之路——&#xff08;一&#xff09;Android App开发基础-1 2 App的工程结构 本节介绍App工程的基本结构及其常用配置&#xff0c;首先描述项目和模块的区别&#xff0c;以及工程内部各目录与配置文件的用途说明&#xff1b;其次阐述两种级别…