C语言:详解指针最终篇(3)

在这里插入图片描述


一.字符指针变量

在指针的类型中我们知道有一种指针类型为字符指针char*。一般我们这样使用:

在这里插入图片描述

我们来看另一种使用方式:

在这里插入图片描述

这个常量字符串就相当于它本身首字符的地址,收地址加上方括号下标就可以访问该表达式中对应下标的元素。可以把该表达式想象成一个数组,所以把常量字符串赋值给p是把首字符的地址赋值给它的。

在这里插入图片描述

在这里插入图片描述

这个时候ps是不能改的运行的程序会崩掉的,原因是因为它是常量字符串不能被修改。

我们通常加上const限制的是*ps。

在这里插入图片描述

当我们先要打印该字符串给它的起始地址就行了。

在这里插入图片描述

我们来看一道题

在这里插入图片描述
打印结果:

在这里插入图片描述

这里str3和str4指向的是一个同一个常量字符串。C/C++会把常量字符串存储到单独的一个内存区域,当几个指针指向同一个字符串的时候,他们实际会指向同一块内存。但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。所以str1和str2不同,str3和str4相同。


二.数组指针变量

之前我们学习了指针数组,指针数组是一种数组,数组中存放的是地址(指针)。数组指针变量是指针变量?还是数组?
答案是:指针变量。

我们已经知道:

整形指针变量:int* pint;存放的是整形变量的地址,能够指向整形数据的指针。浮点型指针变量:float * pf;存放浮点型变量的地址,能够指向浮点型数据的指针。
那数组指针变量应该是:存放的应该是数组的地址,能够指向数组的指针变量。

我们来上例子

在这里插入图片描述

我们要这样理解:(*parr)说明它是指针变量,[4]说明指向的数组的元素个数是4个,int说明的是数组中的每个元素的类型是整型,parr是数组指针变量名。

我们再来看两个例子:

在这里插入图片描述

我们可以得到它的类型是什么

在这里插入图片描述

p的类型是int(*)[10],就是数组指针类型,也是&arr的类型。

我们来看它的用法

在这里插入图片描述

虽然这样可以访问数组,但是不方便,还不如我们之前所讲的例子简单,如:

在这里插入图片描述

关于它的真正的用法,我们先继续往下讲,我们来看二维数组传参的本质。


三.二维数组传参的本质

我们先来看之前关于二维数组传参举的例子

在这里插入图片描述

二维数组传参,实参也是数组名,数组名是数组首元素的地址,既然实参传过去的是地址,形参就可以写成指针变量

这个时候就有一个问题:二维数组的数组名,到底表示的是谁的地址,首元素是谁?

二维数组其实可以看成:一维数组的数组,每个元素是一维数组的数组,把二维数组的每一行看做一个元素。

所以我们知道二维数组的首元素,就应该是它的第一行。二维数组的数组名表示首元素的地址,那么就是第一行的地址。

在这里插入图片描述

我们将上面的例子形参的部分改为指针来接收,二维数组的传参不是这个二维数组而是二维数组首元素的地址,就是第一行的地址,所以函数形参的地方就应该用数组指针来接收,这就是数组指针相关用法之一

我们也可以通过这样的形式打印出来:

在这里插入图片描述

总结一下:二维数组传参的时候,形参的部分可以写成数组,也可以写成指针的形式,写成数组的形式只是为了我们方便理解。


四.函数指针变量

函数指针变量的创建

我们先来写一段代码看一下函数的地址

在这里插入图片描述

函数指针变量的创建跟数组指针的写法是非常相似的。

我们来写代码看关于函数指针的创建

在这里插入图片描述

关于参数名我们可以不写,但是一定要写参数类型,这个时候的pf就是函数指针变量。同样可知把pf去掉就是它的类型(函数指针类型)。

在这里插入图片描述

再来看它的使用

在这里插入图片描述

根据上面我们讲的&函数名和函数名拿到的时候都是函数的地址,我们知道pf不用解引用也是可以使用的。

在这里插入图片描述


五.typedef 关键字

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

1 typedef unsigned int uint;
2 //将unsigned int 重命名为uint

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

typedef int* ptr_t;

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

1 typedef int(*parr_t)[5];// 新的类型名必须在的右边

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

1 typedef void(*pfun_t)(int);// 新的类型名必须在*的右边

我们来看一个小知识点:

在这里插入图片描述


六.函数指针数组

数组是一个存放相同类型数据的存储空间,我们已经学习了指针数组,
比如:

int * arr[10];
2 // 数组的每个元素是int*

那要把函数的地址存到一个数组中,那这个数组就叫函数指针数组,那函数指针的数组如何定义呢?

1 int (* parr1[3])();

parr1先和[]结合,说明parr1是数组,数组的内容是什么呢?是int(*)()类型的函数指针。

来看例子:

在这里插入图片描述

我们再来写代码看一下函数指针数组的使用。


七.计算器的一般实现


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;
}int main()
{int input = 0;int x = 0;int y = 0;int ret = 0;int(*pfArr[5])(int, int) = { 0,Add,Sub,Mul,Div };do{menu();printf("请选择:>");scanf("%d", &input);if (input >= 1 && input <= 4){printf("请输入两个操作数>:");scanf("%d %d", &x, &y);ret = pfArr[input](x, y);printf("%d\n", ret);}else if (input == 0){printf("退出计算器\n");break;}else{printf("选择错误,重新选择\n");}} while (input);return 0;
}

这就是函数指针数组的用途:实现转移表


OK ,关于指针章节的内容都已经讲解完了,C语言也快完结了,大概还有,两三篇,我没有按照C语言知识讲解顺序来发博客,关于C语言的最后的知识内容都已经发过博客了,如果想看的话,可以翻一下我的博客看一下,现在还剩一些学习C语言之间部分,我会尽快整理发出来的,等C语言完结之后,将开启数据结构内容,关于数据结构作者也早早学完还没整理草稿,学校太多事没发,但是我会尽量更新快一些的,敬请期待吧!!!

在这里插入图片描述

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

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

相关文章

【深度学习】 零基础介绍卷积神经网络(CNN)

零基础介绍 卷积神经网络&#xff08;CNN&#xff0c;Convolutional Neural Network&#xff09;是深度学习中的一种神经网络&#xff0c;特别擅长处理图像和视频等有空间结构的数据。 假设我们在做一个“照片分类”的任务&#xff0c;比如判断一张照片中是猫还是狗。下面用一…

Dual-Write Problem 双写问题(微服务)

原文链接https://www.confluent.io/blog/dual-write-problem/ 双写问题发生于当两个外部系统必须以原子的方式更新时。 问题 说有人到银行存了一笔钱&#xff0c;触发 DepositFunds 命令&#xff0c;DepositFunds 命令被发送到Account microservice。 Account microservice需…

ReactPress最佳实践—搭建导航网站实战

Github项目地址&#xff1a;https://github.com/fecommunity/easy-blog 欢迎Star。 近期&#xff0c;阮一峰在科技爱好者周刊第 325 期中推荐了一款开源工具——ReactPress&#xff0c;ReactPress一个基于 Next.js 的博客和 CMS 系统&#xff0c;可查看 demo站点。&#xff08;…

什么叫ip地址一样?网络ip地址一样说明什么

在探索网络世界的奥秘中&#xff0c;IP地址作为网络设备的唯一身份标识&#xff0c;其重要性不言而喻。然而&#xff0c;当我们遇到“IP地址一样”的情况时&#xff0c;不禁会产生诸多疑问&#xff1a;这究竟意味着什么&#xff1f;是否会对网络产生影响&#xff1f;虎观代理小…

C# 探险之旅:第三十二节 - 类型class之(方法重载Overloading):魔法技能的大变身!

嘿&#xff0c;各位勇敢的探险家们&#xff01;欢迎再次踏上C#的奇幻旅程。今天&#xff0c;我们要一起探索一个超级有趣的魔法技巧——方法重载&#xff08;Overloading&#xff09;&#xff01;想象一下&#xff0c;你有一个超级技能&#xff0c;但是这个技能可以根据不同的情…

kubervirt使用与运行策略

三、KubeVirt基本命令 3.1查看virtctl版本&#xff0c;说明安装成功 [rootk8s-master ~]# virtctl version 3.2创建和管理虚拟机 列出所有可用的虚拟机实例 [rootmaster ~]# kubectl get vmi -n <namespace> 参数-n用于指定命名空间 查看特定虚拟机实例的详细信息 […

[Pro Git#3] 远程仓库 | ssh key | .gitignore配置

目录 1. 分布式版本控制系统的概念 2. 实际使用中的“中央服务器” 3. 远程仓库的理解 4. 新建远程仓库 5. 克隆远程仓库 6. 设置SSH Key 实验 一、多用户协作与公钥管理 二、克隆后的本地与远程分支对应 三、向远程仓库推送 四、拉取远程仓库更新 五、配置Git忽略…

【python因果库实战2】使用银行营销数据集研究营销决策的效果2

目录 联系方式的效应 逆概率加权&#xff1a;首次尝试 联系方式的效应 我们已经完成了大部分艰苦的工作&#xff0c;即理解数据并识别处理变量和混杂因素。现在我们可以开始使用 Causal Inference 360 的工具了。 我们将首先研究联系方式 contact 的因果效应。具体来说&…

数据结构初阶---二叉树---堆

一、树 1.树的概念 树是一种非线性的数据结构&#xff0c;由n(n≥0)个有限结点组成的一个有层次关系的集合。形状类似一棵倒挂的树&#xff0c;根朝上&#xff0c;分支向下。 根结点没有前驱结点&#xff0c;可以有n(n≥0)个后继结点。 其余结点被分为M个互不相交的集合&am…

运维 mysql、redis 、RocketMQ性能排查

MySQL查看数据库连接数 1. SHOW STATUS命令-查询当前的连接数 MySQL 提供了一个 SHOW STATUS 命令&#xff0c;可以用来查看服务器的状态信息&#xff0c;包括当前的连接数。 SHOW STATUS LIKE Threads_connected;这个命令会返回当前连接到服务器的线程数&#xff0c;即当前…

.NET6 WebAPI从基础到进阶--朝夕教育

1、环境准备 1. Visual Studio 2022 2. .NET6 平台支持 3. Internet Information Services 服务器&#xff08; IIS &#xff09; 4. Linux 服务器 【 CentOS 系统】 ( 跨平台部署使用 ) 5. Linux 服务器下的 Docker 容器&#xff08; Docker 部署使用&#xff09; …

STM32仿真——01创建工程

目录 1.需要用到的软件工具​编辑 2.第一步Proteus软件新建工程​编辑 3.第二步——stm32cubumx 4、MDK代码编写 #注意安装的过程或者使用过程使用英文&#xff0c;以防报错&#xff1b; 1.需要用到的软件工具 2.第一步Proteus软件新建工程 选中&#xff0c;默认 先布局&…

相位小数偏差(UPD)估计基本原理

PPP中的一个关键性难题在于非差模糊度固定&#xff0c;成功固定非差模糊度可以使 PPP 的收敛速度和定位精度得到显著提升 。 相位小数偏差 (UPD) 是致使相位模糊度失去整数特性的主要因素&#xff0c;精确估计并校正 UPD 是实现非差模糊度固定的重要前提&#xff0c;也是实现…

我们来编程 -- win11多jdk版本切换

题记 售前的酒喝到位了调研需求及文档整理出来了开发要入场了&#xff0c;真惨啊&#xff01;年底了&#xff0c;手里活干的好好的&#xff0c;因为flyback在项目地&#xff0c;硬是被安排进来了拥抱变化&#xff0c;我呸…不得不切换系统&#xff0c;构建代码&#xff0c;一股…

飞腾派4g版本笔记一

飞腾派4g版本开箱体验 开箱包裹内容 打开包装&#xff0c;你可以看到以下物品 一个绿联的usb3.0读卡器、sandisk的32g内存卡(太好了)飞腾派4g版本开发板带散热风扇&#xff08;通过DDR存储的丝印看到是长鑫存储&#xff0c;即为4g内存版本&#xff09;输出为12v 3A的电源适配…

从零用java实现 小红书 springboot vue uniapp (2)主页优化

前言 移动端演示 http://8.146.211.120:8081/#/ 前面的文章我们基本完成了主页的布局 今天我们具体的去进行实现 并且分享我开发时遇到的问题 首先先看效果 java仿小红书主页 实现效果为 1.顶端全屏切换 2.上划加载更多 3.下拉当前页整体刷新 顶端全屏切换我们选择 gui-switch…

3D 生成重建031-One-2-3-45多视图+Neus生成3D

3D 生成重建031-One-2-3-45多视图Neus生成3D* 文章目录 0 论文工作论文方法2 实验结果 0 论文工作 单图像三维重建是一项重要但极具挑战性的任务&#xff0c;需要对现实世界有深入的了解。许多现有的方法通过在二维扩散模型的引导下优化神经辐射场来解决这个问题&#xff0c;但…

JAVA:访问者模式(Visitor Pattern)的技术指南

1、简述 访问者模式(Visitor Pattern)是一种行为型设计模式,允许你将操作分离到不同的对象中,而无需修改对象本身的结构。这种模式特别适合复杂对象结构中对其元素进行操作的场景。 本文将介绍访问者模式的核心概念、优缺点,并通过详细代码示例展示如何在实际应用中实现…

【C++】数的性质问题分析与优化

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目解析与分析题目描述题目分析 &#x1f4af;我的解法与详细解读初始代码实现解法分析 &#x1f4af;老师解法与其改进思路老师代码实现改进与优势 &#x1f4af;对比分析…

让文案生成更具灵活性/chatGPT新功能canvas画布编辑

​ ​ OpenAI最近在2024年12月发布了canvas画布编辑功能&#xff0c;这是一项用途广泛的创新工具&#xff0c;专为需要高效创作文案的用户设计。 无论是职场人士、学生还是创作者&#xff0c;这项功能都能帮助快速生成、优化和编辑文案&#xff0c;提升效率的同时提高内容质量…