【C语言】14.数组指针与函数指针及其应用

一、数组指针

顾名思义,数组指针就是指向数组的指针。形如:int (*p)[10];
注意:[]的优先级要高于*号的,所以必须加上()来保证p先和*结合。

数组指针的使用

int arr[10] = {0};
int (*parr)[10] =&arr;  //数组指针的使用
 |     |    |
 |     |    |
 |     |    parr指向数组的元素个数
 |     parr是数组指针变量名
 parr指向的数组的元素类型

二、二维数组传参的实质

首先我们再次理解⼀下二维数组,二维数组起始可以看做是每个元素是⼀维数组的数组,也就是二维数组的每个元素是⼀个⼀维数组。那么二维数组的首元素就是第⼀行,是个⼀维数组。
在这里插入图片描述
⼆维数组传参本质上也是传递了地址,传递的是第⼀行这个⼀维数组的地址,那么形参也是可以写成指针形式的

#include <stdio.h>
void test(int (*p)[5], int r, int c)
{
	 int i = 0;
 	 int j = 0;
	 for(i=0; i<r; i++)
	 {
		 for(j=0; j<c; j++)
		 {
			 printf("%d ", *(*(p+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}};
	 test(arr, 3, 5);
 return 0;
}

⼆维数组传参,形参的部分可以写成数组,也可以写成指针形式

三、函数指针

根据前面学习整型指针,数组指针的时候,我们的类比关系,我们不难得出结论:函数指针变量应该是用来存放函数地址的,可以通过地址能够调用函数的。

int (*pf) (int x, int y)
 | 	   |		|
 |	   | 		|
 |     | 		pf指向函数的参数类型和个数的交代
 |     函数指针变量名
 pf指向函数的返回类型
 
 int (*) (int x, int y) //pf函数指针变量的类型 

函数指针的使用

#include <stdio.h>
int Add(int x, int y)
{
	 return x+y;
}
int main()
{
	 int(*pf)(int, int) = Add;
 
	 printf("%d\n", (*pf)(2, 3));
	 printf("%d\n", pf3(3, 5));//这两种方式均可以
	 return 0;
}

四、函数指针数组及其应用

把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组。定义形式int (*parr1[3])();

转移表

#include <stdio.h>
int add(int a, int b)
{
	 return a + b;
}
int sub(int a, int b)
{
	 return a - b;
}
int mul(int a, int b)
{
	 return a*b;
}
int div(int a, int b)
{
	 return a / b;
}
void menu()
{
 	printf("*************************\n");
	printf("*****1:add  2:sub ****** \n");
	printf("*****3:mul  4:div *******\n");
	printf("*****0:exit       ****** \n");
	printf("*************************\n");
}
int main()
{
	 int x, y;
	 int input = 0;
	 int ret = 0;
	 
	 int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表 
	 
	 do
	 {
		 printf( "请选择:" );
		 scanf("%d", &input);
		 if ((input <= 4 && input >= 1))
		 {
			 printf( "输⼊操作数:" );
			 scanf( "%d %d", &x, &y);
			 ret = (*p[input])(x, y);
			 printf( "ret = %d\n", ret);
		 }
		 else if(input == 0)
		 {
			 printf("退出计算器\n");
		 }
		 else
		 {
			 printf( "输⼊有误\n" ); 
		 }
		}while (input);
	 return 0;
}

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

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

相关文章

【Matlab】BP 神经网络分类算法(附代码)

资源下载&#xff1a; https://download.csdn.net/download/vvoennvv/89466423 分类算法资源合集&#xff1a;https://download.csdn.net/download/vvoennvv/89466519 目录 Matlab SVM支持向量机分类算法 Matlab RF随机森林分类算法 Matlab RBF径向基神经网络分类算法 Mat…

【C++题解】1713 - 输出满足条件的整数3

问题&#xff1a;1713 - 输出满足条件的整数3 类型&#xff1a;简单循环 题目描述&#xff1a; 有一个数列&#xff0c;该数列的前 4 个数是&#xff1a; 1 4 7 10 &#xff1b; 请从键盘读入一个正整数 n &#xff0c;请通过观察前 4 项的规律&#xff0c;输出 1∼n 之间所有…

课程标准包括哪些内容?

老师们常常会思考&#xff1a;课程标准究竟包含哪些要素&#xff1f;课程标准不仅仅是一系列冷冰冰的条条框框&#xff0c;而是活生生的指导原则&#xff0c;引领教学实践&#xff0c;激发学生的潜能。 课程标准&#xff0c;简而言之&#xff0c;是对学习成果的期望和要求的明确…

python20 函数的定及调用

函数的定及调用 函数是将一段实现功能的完整代码&#xff0c;使用函数名称进行封装&#xff0c;通过函数名称进行调用。以此达到一次编写&#xff0c;多次调用的目的 用 def 关键字来声明 函数 格式&#xff1a; def 函数名(参数列表):函数体[:return 返回值是可选的&#xff0…

接口自动化测试实战:测试用例也能自动生成

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 作为测试&#xff0c;你可能会对以下场景感到似曾相识&#xff1a;开发改好的 BUG 反复横跳&…

DC电源实现12V转换为9V,有这4方法?

想要将DC12V电压转换为DC9V电压输出。DCDC电源降压的方式很多&#xff0c;相关类型的电源芯片也很多&#xff0c;有线性降压模式也有开关降压模式的电源芯片。 1、若输出电源电压要求不高&#xff0c;电流≤1A&#xff0c;直接使用7809三端稳压器即可&#xff0c;既简单又方便。…

电脑ai写作软件,4款实用的软件!

在数字化时代&#xff0c;AI写作软件已经成为创作者们不可或缺的工具。它们利用先进的自然语言处理技术和大数据分析&#xff0c;能够快速生成高质量的文章&#xff0c;大大提升了创作效率。那么&#xff0c;市面上有哪些值得一试的电脑AI写作软件呢&#xff1f;让我们一起来盘…

The Sandbox 购入几大迷因币!

The Sandbox 是一个致力于支持虚拟艺术家和创作者的全球性社区。我们相信创意文化是开放式元宇宙的基石&#xff0c;我们会花时间参与并帮助 Web3 生态系统的发展&#xff0c;使其中的参与者受益。 为了进一步实现这一目标&#xff0c;我们购买了几种流行的 迷因币&#xff0c;…

20240621将需要自启动的部分放到RK3588平台的Buildroot系统的rcS文件中

20240621将需要自启动的部分放到RK3588平台的Buildroot系统的rcS文件中 2024/6/21 17:15 开发板&#xff1a;飞凌OK3588-C SDK&#xff1a;Rockchip原厂的Buildroot 缘起&#xff1a;在凌OK3588-C的LINUX R4系统启动的时候&#xff0c;需要拉高GPIO4_B5、GPIO3_B7和GPIO3_D0。…

内江科技杂志内江科技杂志社内江科技编辑部2024年第13期目录

科教兴国 内江市科技局“五个强化”助力“五经普”工作有序推进 本刊通讯员; 1 内江市多措并举融入成渝中线科创走廊建设 本刊通讯员; 2 科学管理《内江科技》投稿&#xff1a;cnqikantg126.com 数字化社会公共图书馆的服务效能提升策略研究 闫永凤;臧萌;王亚博;王…

Midjourney v6 快速入门指南

Midjourney V6快速入门教程来了&#xff0c;这是Midjourney的AI图像生成器的又一次令人印象深刻的升级。最显著的是&#xff0c;V6在逼真渲染和图像中的文字功能方面取得了重大进展。 在这篇文章中&#xff0c;我们将探讨如何开始使用Midjourney V6&#xff0c;并提供一些示例…

使用 Java 构建和消费 RESTful 服务的基本方法

REST&#xff08;Representational State Transfer&#xff09;是一种架构风格&#xff0c;它基于Web标准和HTTP协议&#xff0c;常用于构建网络服务。使用Java构建和消费RESTful服务需要掌握一些基本概念和技术。 一、RESTful服务的基本概念 1. REST架构风格 REST架构风格的…

四,SSM整合-前后端分离(实现分页+前后端校验)

分页与校验 实现功能07-分页显示列表需求分析/图解思路分析代码实现完成测试 实现功能08-带条件查询分页显示列表需求分析/图解思路分析代码实现 实现功能09-添加家居表单前端校验需求分析/图解思路分析代码实现 实现功能10-添加家居表单后端校验需求分析/图解思路分析代码实现…

精准测试与传统的手工测试

大部分测试从业人员都经历了手工测试到自动化测试递进&#xff0c;测试技术及思路都发生了日新月异的变化&#xff0c;有些中厂及大厂都有一套强大且复杂的自动化测试用例时刻保障产品的稳定性及正确性。 所谓精准测试&#xff0c;就是借助一定的技术手段、通过算法的辅助对传…

虚拟机拖拽文档造成缓存过大

查看文件夹大小&#xff1a;du -h --max-depth1 缓存位置&#xff1a;~/.cache/vmware/drag_and_drop 删除&#xff1a;rm -fr ~/.cache/vmware/drag_and_drop 释放了3GB

解决Few-shot问题的两大方法:元学习与微调

基于元学习&#xff08;Meta-Learning&#xff09;的方法&#xff1a; Few-shot问题或称为Few-shot学习是希望能通过少量的标注数据实现对图像的分类&#xff0c;是元学习(Meta-Learning)的一种。 Few-shot学习&#xff0c;不是为了学习、识别训练集上的数据&#xff0c;泛化…

深入理解前端缓存

前端缓存是所有前端程序员在成长历程中必须要面临的问题&#xff0c;它会让我们的项目得到非常大的优化提升&#xff0c;同样也会带来一些其它方面的困扰。大部分前端程序员也了解一些缓存相关的知识&#xff0c;比如&#xff1a;强缓存、协商缓存、cookie等&#xff0c;但是我…

后端程序员的Linux命令指南

后端程序员的终极命令指南&#xff1a;考考自己是不是真正掌握Linux的使用 欢迎各位穿着格子衬衫&#xff0c;常年抱着键盘睡觉的后端小伙伴们&#x1f44b;&#x1f44b;&#x1f44b;&#xff01;今天&#xff0c;考考你们是不是掌握以下让你们在日后在服务器上叱咤风云的命令…

vscode颜色没有显示出来颜色预览效果,安装插件解决

1、先上一张图&#xff0c;看看之前没有安装插件的Html颜色的色块 2、安装插件Color Highlight 这样颜色对应的效果就出来了。

O2OA的数据库数据库配置-使用不同用户访问Oracle时报错-表或视图不存在

在使用Oracle数据库时&#xff0c;多个O2OA服务器同一个Oracle实例中使用不同的用户启动时&#xff0c;可能会遇到数据库访问的错误。本篇阐述此类问题以及解决方案。 一、先决条件&#xff1a; 1、O2OA已经下载并且解压到指定的目录&#xff1b; 2、Oracle数据库已经完成安…