当前位置: 首页 > news >正文

C语言(长期更新)第13讲:指针详解(三)

C语言(长期更新)

第13讲:指针详解(三)

    跟着潼心走,轻松拿捏C语言,困惑通通走,一去不回头~欢迎开始今天的学习内容,你的支持就是博主最大的动力。博主主页:潼心1412o-CSDN博客


知识回顾

上节课我们学习了指针的部分内容,对基础内容有了扎实的掌握,今天我们来继续学习几种特殊的指针,坐稳了,我们发车,gogogo,出发喽!


13.1 字符指针变量

我们知道常见的用法

除此之外,还有另一种用法

指针pc存放的是常量字符串第一个字符‘a’的地址

下面我们看一道相关例题

 C/C++会把常量字符串存放在一个单独的内存区域

str3和str4指向同一个字符串,故指向同一片空间,地址相同

而str1和str2则是两个数组,会开辟出不同的内存空间

故str1和str2不同,str3和str4相同

13.2 数组指针变量

前面我们学了指针数组,那数组指针又是什么呢?

很简单,存放数组的指针

p先和*结合,说明p是⼀个指针变量

指针指向的是⼀个大小为10个整型的数组,所以p是⼀个指针

指向⼀个数组,叫 数组指针

注意:[]的优先级要高于*号的,所以必须加上()来保证p先和*结合
 

13.3 二维数组传参本质

有了数组指针的理解,我们·就可以讲二维数组传参的本质了

首先我们重新定义下二维数组

二维数组可以看作每个元素都是一维数组的数组

那么二维数组的首元素,也就是第一行,就是一维数组

我们又知道数组名是首元素的地址,所以二维数组的数组名也是第一行的地址,即一维数组的地址

那么,既然传递的是一维数组的地址,那么我们就可以使用数组指针了

p+i  p类型为int(*)[5],每加一跳过一行

*(p+i)拿到的是二维数组中每个一维数组的地址,类型为int [5]

*(p+i)+j 解引用后,每加一跳过一个一维数组中存放元素的地址

*(*(p+i)+j)拿到的是一维数组中的每个元素

13.4 函数指针

函数指针就是存放函数地址的指针,未来通过地址调用函数

函数的函数名就是地址

当然,也可以通过&函数名的方式打印函数的地址,二者结果相同

那么怎么创建函数指针变量呢?
下面举个🌰

函数指针的写法与数组指针极为相似

在实际应用中,函数指针可解引用,也可不解引用

解引用的方式我们很容易理解

不解引用是怎么回事呢

很简单我们p指针存放的是add函数的地址,而add就是add函数的地址

那我们就可以很合理的认为add==p

那既然add(3,4)的使用好无问题,直接写p(3,4)当然没毛病

13.5 typedef关键字

typdef使用来类型重命名的,可以使复杂的类型简单化,方便书写和使用

比如unsigned int你可能觉得书写不太方便,就可以将这个类型重命名为uni

函数指针和数组指针的重命名有一点特殊,需要我们注意一下

13.6两个有趣的代码

突破口:0,啥意思?只能是强制类型转换呗

相当于将0强行当做一个地址,这个0地址存放的函数是一个无参的void函数

整段代码的意思是调用0地址处存放的函数

这个我们看到singal就知道,只有一种情况会出现自定义名后跟没有变量名的()

那就是函数声明。那函数声明还需要一个函数返回类型啊,说明这个函数类型是void(*)(int),

就是说这个函数返回值是一个函数指针

总结一下就是返回值为函数指针,参数类型为int和函数指针的一个函数声明

想要简化一下上面的代码,我们就可以使用typedef

13.7 函数指针数组

还是指针数组,只不过指针是函数指针

要求:函数指针的类型必须相同,包括参数和返回值

因为数组就只能存放相同类型的元素

13.8 转移表

函数指针数组具体怎么使用呢?这就要讲到转移表了。

我们先来看一下这段代码

是我们熟悉的方法,但是主函数部分代码过于冗余

让我们试一下刚才的函数数组指针


好了今天的学习内容就到这里啦,谢谢你的陪伴,我是潼心,下次再见~如果这篇文章对你有帮助的话。请务必给主播一个一键三连,球球了,这对主播很重要~ 

博主主页:潼心1412o-CSDN博客

http://www.dtcms.com/a/365657.html

相关文章:

  • 毒蛇品种检测识别数据集:12个类别,6500+图像,全yolo标注
  • 印度股票数据API对接文档
  • 硬件(一)51单片机
  • 【和春笋一起学C++】(三十九)类作用域
  • [鸿蒙心迹]带新人学鸿蒙的悲欢离合
  • “企业版维基百科”Confluence
  • Docker实战指南:从安装到架构解析
  • 【QT特性技术讲解】QPrinter、QPdf
  • leetcode 38 外观数列
  • 联想开天X7:携手海光,开启信创PC高性能新时代
  • Java中 String、StringBuilder 和 StringBuffer 的区别?
  • WHAT - 协程及 JavaScript 具体代码示例
  • PgManage:一款免费开源、跨平台的数据库管理工具
  • Packet Radio Network,PRNET
  • 从发现到恢复,看瑞数信息如何构建“抗毁重构”实战路径
  • VR节约用水模拟体验系统:沉浸式体验如何改变我们的用水习惯
  • 全员0门槛数据分析:纷享销客BI Agent,让数据价值直抵业务
  • 实现信号的小波分解和重构
  • 自动化仓库托盘搬运减少错误和损坏的方法有哪些?实操案例解读
  • 12、Docker基本概念 容器与镜像与安装
  • MyBatis xml配置文件
  • 借助Aspose.ZIP SDK,在 C# 中压缩和提取 LZIP 文件
  • ubuntu的2T新硬盘分区、格式化并挂载
  • Linux学习:生产者消费者模型
  • 明远智睿 3568 核心板:四核 Cortex - A55 架构驱动的性能新标杆
  • C++中cdecl、stdcall、fastcall、thiscall异同——10分钟弄清
  • linux0.12 head.s代码解析
  • Alpha World赞助Hello Blockchain Thailand,AWT成为全球共识焦点
  • 袋鼠云产品功能更新报告14期|实时开发,效率再升级!
  • 【IQA技术专题】NIQE代码讲解