【C语言】你真的了解指针吗?(2)

C语言 ———— 速通指针 我们要了解什么? 使用它来获得变量在内存中所在的地址,值得一提的是,&对数组arr需要我们特别注意,众所周知,arr数组名就是数组的首元素地址所以很多时候需要数组arr相关指针时我们只需用到数组名即可,那么&arr是否也是首元素地址呢,显然不是,它拿到了整个数组的地址,使用它作为指针指向类型时,我们在+1运算操作时跳过的是整个数组大小的空间,这与单用arr得区别就极为清晰了。在我们运用指针实现某些功能的时候,往往不会固定传参的实参的类型,可能这次是int*下次就是char*,那我在函数的形参部分如何写接受的参数类型? 阅读详情

这是指针的第二篇文章,这篇文章我将会讲解一下函数指针和函数指针数组以及它们的具体使用。

目录

一、函数指针

 二、函数指针数组

函数指针数组的定义以及初始化

 函数指针数组的使用

 三、转移表


一、函数指针

函数指针,顾名思义就是指向函数的指针,接下来我们来看看函数指针使用

void print()
{
    printf ("hello\n");
}
int main ()
{
   void (*p)()=print;
   (*p)();
   return 0;
}

我们来分析一下void (*p)()=print这段代码的组成。

函数指针定义就是由上面3部分组成,这时我们不禁提出几个猜想:①函数名表示函数地址。②小括号的优先级比*号高。

这时我们来几个小实验来论证我们刚刚的猜想

①函数名表示函数地址:

②小括号的优先级比*号高:

这里我将(*p)()变成*p();

这里编译器就报错了,然后我们来看看官方的优先级排序(越靠上优先级越高)

 

 接下来我们来看看两端代码,巩固我们对函数指针的理解

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

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

 二、函数指针数组

在之前的学习中我们已经见过数组指针数组了,函数指针数组自然不难理解,就是存放类型为函数指针的数组。

这里我们简单举一个函数指针数组的使用例子。

函数指针数组的定义以及初始化

首先我们是要定义一个数组,所以我们先写上arr_print[3],然后再写数组类型,因为我们要存放函数指针类型,所以我们写上void (*)(),void表示函数返回类型,(*)表示是一个指针,然后()表示是一个无参数的函数,这样我们再将arr_print放入括号中,最后就可以对数组进行初始化了,自此,一个函数指针数组arr_print就完成了。(可以不必放指针,直接放入函数名也是可以的,因为函数名就表示函数地址嘛)

 函数指针数组的使用

接下来我们来了解函数指针数组的使用,我们可以使用下标引用操作符,这样就可以拿出数组中的第i个元素。arr_print[0]这样就像当与拿出了函数,即可以调用,然后我们传入参数,因为我们这几个函数都是没有参数的,所以我们直接在后面加上一个空括号即可完成对print函数的调用。(在此注意一定,数组中所有元素类型是相同的,所以我们在使用函数指针数组时,要保证函数指针的返回类型以及函数参数是相同的才能使用)

 三、转移表

我们在学习函数指针数组后,我们可以设计多个具有类似功能的函数,然后用函数指针数组调用它们,这样就可以省略掉相同的代码,从而节省代码量。

那这样我们可以使用函数指针数组来制作一个计算器。因为计算器如果使用函数实现,它们的类型是相同的,从键盘传入两个待操作的参数,无需返回类型,直接打印结果就行了。

#include <stdio.h>
//calc  转移表
void add(int a, int b)
{
	printf("%d\n", a + b);
}
void sub(int a, int b)
{
	printf("%d\n", a - b);
}
void mul(int a, int b)
{
	printf("%d\n", a * b);
}
void div(int a, int b)
{
	printf("%d\n", a / b);
}
int main()
{
	int input = 1;
	void (*p[5])(int, int) = { NULL,add,sub,mul,div };
	int x, y;
	while (input)
	{
		printf("*************    计算器   **************\n");
		printf("********  1.add  *******  2.sub  *******\n");
		printf("********  3.mul  *******  4.div  *******\n");
		printf("请输入操作:\n");
		scanf("%d", &input);
		if ((input) <= 4 && input >= 1)
		{
			printf("请输入操作数\n");
			scanf("%d %d", &x, &y);
			p[input](x, y);
		}
		else
			printf("输入错误\n");
	}
}

会发现,只需要40行代码就可以完成一个计算器的功能,像这种相同类型的函数,我们使用函数指针数组会极大的简化代码量,不需使用switch语句来将用户输入的代码一一判断,然后重复相同的代码。

好了,这篇文章的分享就到这了,如果各位觉得还不错的话,可以留个赞嘛,谢谢各位(如果发现文章有错误的地方可以指向,本人必会第一时间修改)

你真的了解吗?(深入指针,assert,数组名) 指针运用与类型,数组名与传参,代码阅读与重命名关键字 阅读详情

相关推荐

在VScode中配置Python开发环境(详细图片文字结合)

需要用到的软件下载包在官网里找一下,在window下的点击安装就行了;找一个3.8到3.10版本差不多都完善跟的上;

m0_72811193的博客 1599

c语言指针(深入了解指针)

由浅到深全面的了解指针(小马带你拿下指针的学习)

小马同学的博客 2万+

Adobe软件非正版弹窗终极解决方案:PS/Ai/PR/AE禁用提示一键清除指南

本文提供了Adobe软件非正版弹窗的终极解决方案,包括PS、Ai、PR、AE等软件的禁用提示一键清除指南。通过专业清理工具和手动修改系统文件的方法,帮助用户彻底解决Adobe弹窗问题,提升使用体验。适用于Windows和Mac系统用户,操作简单高效。

weixin_30872337的博客 5369

C语言指针的初步了解

C语言指针的初步了解

zzqingyun的博客 1万+

Rstudio安装org.Hs.eg.db

自己也是个小白,初次安装org.Hs.eg.db碰到好多问题,步骤总结如下: 第一,instal.packages()安装,不行则换 BiocManager::install() 第二,如BiocManager不成,说明不是最新版本,可按提示安装最新版 BiocManager::install(version = '3.13') #由于R版本较新,按照提示中的相关信息,安装最新版本的 第三,再次安装 BiocManager::install("org.Hs.eg.db") 第四,之后每个人.

ZH_DDong的博客 2万+

保姆级教程:手把手教你给联想System x 3650 M5服务器配置RAID 5并U盘装系统

本文提供联想System x 3650 M5服务器配置RAID 5并U盘安装系统的详细教程,特别适合零基础运维人员。从准备工作、RAID 5配置到U盘引导和系统安装,涵盖全流程关键步骤与常见问题解决方案,帮助用户高效完成服务器部署。

weixin_42535703的博客 358

【详解C语言指针】我真的让C指针给我唱征服了~乌拉

结合图解,深入探究指针,非常值得学习!

大猩猩!的博客 2万+

Element-UI全面入门与实战技巧

Element-UI 是一套基于 Vue 2.0 的桌面端组件库,由饿了么前端团队开发并维护。它提供了一系列丰富的 UI 组件,旨在帮助开发者快速构建高效、美观的 Vue 应用程序。Element-UI 是一款遵循 Ant Design 设计规范的 Vue UI 库,它涵盖了从按钮、输入框、选择器到表格、标签、进度条等众多常用的界面元素。Element-UI 的组件不仅功能全面,而且易于定制,使得开发者可以快速实现个性化的页面设计。Element-UI 的特点包括:在使用 Element-UI 之前,需要确

全世界的博客 2863

你真的理解C语言的灵魂 “ 指针 ” 吗?(初阶篇)

C/C++指针详解之基础篇(史上最全最易懂指针学习指南!!!!)

Edison's 小宇宙 8531

【YOLOv10改进[Backbone]】使用ADNet改进YOLOv10在噪声干扰下的目标检测效果(图像去噪)+ 含全部代码和详细修改方式 + 手撕结构图 + 全网首发

使用ADNet改进YOLOv10在噪声干扰下的目标检测效果(图像去噪)+ 含全部代码和详细修改方式 + 手撕结构图 + 全网首发 + 遥遥领先

静谧、淡雅 2858

ollama如何在自己的服务器上跑Qwen3(小白必看)

在国内下载ollama最新安装包时,使用curl -fsSL https://ollama.com/install.sh | sh命令可能会遇到网络问题导致下载进度停滞。为了解决这一问题,可以通过国内的镜像源进行下载,例如使用modelscope社区提供的最新ollama镜像仓库。具体步骤包括:首先通过pip install modelscope安装modelscope,然后使用modelscope download命令下载ollama-linux镜像,接着进入下载目录并赋予安装脚本执行权限,最后运行安装脚

Ven%的博客 756

C语言——指针

C语言——指针

weixin_59796310的博客 11万+

优快云 2

2

qq_62260432的博客 5237

c语言—指针详解

文章目录一、指针是什么二、指针和指针变量1.左值与右值2.两者的区别1.指针2.指针变量3.如何使用三、指针和指针类型 一、指针是什么 指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。 指针就是地址,地址就是指针。 使用指针的目的是提高使用效率 二、指

Welcome to my blog. 2万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【C语言】超详讲解☀️指针是个什么针?(一次性搞定指针问题)

目录 前言 什么是指针? 引例 计算机是怎么对内存单元编号的呢? 内存空间的地址如何得到 想存地址怎么办? ​ 本质目的不是为了存地址 指针和指针类型 前言 指针这一部分可能很多人在学习的时候都觉得很难,但在这里我想说的是:不要自己吓自己,想一想,你当初刚上大学的时候可能觉得高数非常难,最后学完整本书的时候回过头再看还觉得很难吗? 肯定已经觉得没有刚开始学那么难了,那么其实指针也是这样的,只要把里面的东西都搞清楚,你就不觉得难了。 一、 什么是...

weixin_46531416的博客 5202

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

带你深入了解c语言指针后续

c语言指针完结,带你更深入了解函数指针,函数指针数组,函数指针数组指针。以及浅谈回调函数。

@初阶牛的博客 3388

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C语言菜鸟入门·一文带你从浅入深了解指针

指针从浅入深详解,带你不在了解指针的使用

时光の尘的博客 2251

C语言-入门级别指针详解带你快速了解指针

简单易懂,带你快速了解指针。

YU-fect的博客 919

你真的明白C语言指针吗?你真的了解数组吗?

C语言数组与指针知识解析 本文通过多个示例深入探讨了C语言中数组与指针的关系及sizeof、strlen等操作符的使用。主要内容包括: 数组名在sizeof中的不同表现:单独出现时表示整个数组大小,其他情况表示首元素地址 指针运算的特点:指针加一的步长取决于指针类型 等等

m0_52467477的博客 771

C语言:深入了解指针2(超详细)

指针是一个变量,它存储的是另一个变量的内存地址。而二级指针则是存储指针变量的内存地址,其他的三级指针,四级指针......等,都是一样的。类型 *指针变量名;类型 **二级指针变量名;inta = 10;// 一级指针,指向int类型变量aint// 二级指针,指向一级指针pa在上述代码中,pa是一个一级指针,它存储了a的地址;ppa是一个二级指针,它存储了pa的地址。int b = 20;int c = 30;

2501_90200491的博客 1379

带你深层了解c语言指针

数组指针,指针数组,一维数组传参,二维数组传参相关指针讲解,让你对指针有更深层的理解.

@初阶牛的博客 4021

指针c语言有什么作用,c语言中指针有什么用?

一、什么是指针C语言里,变量存放在内存中,而内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址。CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位。这里,数据对象是指存储在内存中的一个指定数据类型的数值或字符串,它们都有一个自己的地址,而指针便是保存这个地址的变量。也就是说:指针是一种保存变量地址的变量。前面已经提到内存其实就是一组有序字节组成的数组,数组中,每个字节大大...

weixin_42515781的博客 9108

你真的了解指针吗?(初阶)

你真的了解指针吗?(初阶)

努力进大厂的小码娄 308

C语言指针详解2

C语言指针详解(2)

2401_84797190的博客 1705

【C语言】深入了解指针(2),进来小白,出去大佬!

深入了解指针(2),进来小白,出去大佬!

Gao123456fy的博客 1505
上一篇: 【C语言】你真的懂指针吗? (1)
下一篇: 【C语言】qsort函数的使用和模拟实现
Brant_zero2022
博客等级 码龄5年 582粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Brant_zero2022

素材免费分享不求打赏,只求关注

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值