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

news2024/11/27 15:46:37

一、数组指针

顾名思义,数组指针就是指向数组的指针。形如: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.coloradmin.cn/o/1825684.html

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

相关文章

Go语言结构体内嵌接口

前言 在golang中&#xff0c;结构体内嵌结构体&#xff0c;接口内嵌接口都很常见&#xff0c;但是结构体内嵌接口很少见。它是做什么用的呢&#xff1f; 当我们需要重写实现了某个接口的结构体的(该接口)的部分方法&#xff0c;可以使用结构体内嵌接口。 作用 继承赋值给接口…

APP各种抓包教程

APP各种抓包教程 9/100 发布文章 wananxuexihu 未选择任何文件 new 前言 每当遇到一些 APP 渗透测试项目的时候&#xff0c;抓不了包的问题令人有点难受&#xff0c;但是抓不了包并不能代表目标系统很安全&#xff0c;那么接下来我会整理一下目前我所了解到的一些抓包方法 **声…

C++ PDF转图片

C PDF转图片#include "include/fpdfview.h" #include <fstream> #include <include/core/SkImage.h>sk_sp<SkImage> pdfToImg(sk_sp<SkData> pdfData) {sk_sp<SkImage> img;FPDF_InitLibrary(nullptr);FPDF_DOCUMENT doc;FPDF_PAGE …

foxmai邮箱使用技巧图文板简单容易,服务器配置密钥配置

本人详解 作者&#xff1a;王文峰&#xff0c;参加过 CSDN 2020年度博客之星&#xff0c;《Java王大师王天师》 公众号&#xff1a;JAVA开发王大师&#xff0c;专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生&#xff0c;期待你的关注和支持&#xf…

欧洲杯德语词汇与表达,柯桥零基础德语培训

欧洲杯 - die Europameisterschaft 足球 - der Fuball 比赛 - das Spiel / die Partie 球员 - der Spieler 教练 - der Trainer 裁判 - der Schiedsrichter 球迷 - die Fans 进球 - das Tor 守门员 - der Torwart / der Torhter 前锋 - der Strmer 中场 - der Mittelf…

SM3国密算法:优秀的密码散列函数

随着信息技术的飞速发展&#xff0c;信息安全已成为全球关注的焦点。密码学作为保障信息安全的核心技术&#xff0c;其重要性不言而喻。中国在密码学领域也取得了显著的成就&#xff0c;其中SM3国密算法就是中国自主设计并推广使用的密码学标准之一。 一、SM3算法概述 SM3算法…

Python自动化办公(一) —— 根据PDF文件批量创建Word文档

Python自动化办公&#xff08;一&#xff09; —— 根据PDF文件批量创建Word文档 在日常办公中&#xff0c;我们经常需要根据现有的PDF文件批量创建Word文档。手动操作不仅费时费力&#xff0c;而且容易出错。幸运的是&#xff0c;使用Python可以轻松实现这个过程。本文将介绍如…

探索C嘎嘎的奇妙世界:第四关---引用与内联函数

1 引用: 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。 #include<iostream> using namespace std;int main() {int a 0;// 引用&#xff1a;…

谷歌重塑Transformer:无限记忆力,无限长输入,登上Nature

Infini-attention机制为Transformer在具有挑战性的长语境任务中释放出了新的能力&#xff0c;对于调整现有模型以适应长输入也非常实用。 谷歌的最新研究成果Infini-attention机制&#xff08;无限长注意力&#xff09;将内存压缩引入了传统注意力机制&#xff0c;并在单个Tra…

ffmpeg封装和解封装介绍-(8)解封装和封装重构

头文件&#xff1a; xformat.h #pragma once/// 封装和解封装基类#include <mutex> struct AVFormatContext; struct AVCodecParameters; struct AVPacket; struct XRational {int num; ///< Numeratorint den; ///< Denominator }; class XFormat { public:/// &…

注册中心理论学习

注册中心介绍 注册中心&#xff08;也称为服务注册中心或服务发现服务&#xff09;是微服务架构中的一个关键组件&#xff0c;它负责服务的注册与发现。在微服务体系中&#xff0c;服务实例的数量和位置是动态变化的&#xff0c;注册中心提供了一个集中的地方来存储这些信息&a…

比特币全节点搭建

比特币全节点搭建 参考: https://www.cnblogs.com/elvi/p/10203927.html

聚焦赛宁网安竞赛平台+赛事服务,引领网络安全竞赛新潮流

第八届XCTF总决赛将在2024年6月22日于中国成都震撼开启&#xff0c;本届总决赛分为个人Live Solo和团队KOH巅峰对决两个赛道&#xff0c;从个人和团队多角度全方位考察参赛人员的竞技水平。 巅峰对决 智慧的火花在此碰撞 个人Live Solo赛制 Live Solo赛分为晋级赛和Solo赛。…

leetcode刷题记录42-1584. 连接所有点的最小费用

问题描述 给你一个points 数组&#xff0c;表示 2D 平面上的一些点&#xff0c;其中 points[i] [xi, yi] 。 连接点 [xi, yi] 和点 [xj, yj] 的费用为它们之间的 曼哈顿距离 &#xff1a;|xi - xj| |yi - yj| &#xff0c;其中 |val| 表示 val 的绝对值。 请你返回将所有点连…

2.深度学习-线性回归

文章目录 环境配置&#xff08;必看&#xff09;线性回归代码工程运行结果1.对比图2.运行结果 环境配置&#xff08;必看&#xff09; Anaconda-创建虚拟环境的手把手教程相关环境配置看此篇文章&#xff0c;本专栏深度学习相关的版本和配置&#xff0c;均按照此篇文章进行安装…

工业 UI 风格,展现独特魅力

工业 UI 风格&#xff0c;展现独特魅力

「TCP 重要机制」滑动窗口 粘包问题 异常情况处理

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;计网 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 滑动窗口&粘包问题&异常情况处理 &#x1f349;滑动窗口&#x1f34c;流量控制&#x1f34c;拥塞控制&#x1f34c;延时应答&…

【Agent应用】营销大师 | 文案创作助手

&#x1f495;营销大师 | 文案创作助手&#x1f495; &#x1f525; 解锁无限创意可能&#xff01;想要轻松驾驭朋友圈、小红书、公众号&#xff1f;渴望一键生成PPT提纲、诗词创作、作文灵感&#xff1f;我们应有尽有&#xff01; &#x1f31f; 功能亮点 朋友圈文案&#x1…

为什么文件占用的空间会大于文件实际大小

以windows系统举例&#xff0c;先看几张图&#xff1a; 图1&#xff1a;文件的大小比占用空间更小。 图2&#xff1a;文件的大小和占用空间大小一致。 图3&#xff1a;文件大小比占用空间大小更大。 上面3张图展示了文件大小与占用空间的大小几种情况&#xff0c;前两种场景是…

【Java】解决Java报错:MalformedURLException in URL Construction

文章目录 引言一、MalformedURLException的定义与概述1. 什么是MalformedURLException&#xff1f;2. MalformedURLException的常见触发场景3. 示例代码 二、解决方案1. 检查并纠正URL格式2. 使用URI类进行预处理3. 动态构建URL4. 使用第三方库进行URL验证 三、最佳实践1. 始终…