当前位置: 首页 > 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.xdnf.cn/news/1446985.html

相关文章:

  • GTH收发器初始化和复位全解析
  • 面试复习题-kotlin
  • ArcGIS与GISBox对比:中小企业GIS工具的高门槛与零门槛之选
  • Dify部署全攻略:从零开始搭建AI应用开发平台
  • 【高级】系统架构师 | 信息系统战略规划、EAI 与新技术
  • 华为HCIP、HCIE认证:自学与培训班的抉择
  • 《苍穹外卖》开发环境搭建_后端环境搭建【简单易懂注释版】
  • 牛子图论1(二分图+连通性)
  • 在 Ray Data 和 Ray Serve 中推出原生 LLM API
  • 生产环境中redis的SCAN命令如何替代KEYS命令?
  • 学习嵌入式的第三十二天——网络编程——TCP
  • Python/JS/Go/Java同步学习(第二篇)四语言数据基本类型对照表: 老板让我统一系统数据类型?(附源码/截图/参数表/老板沉默术)
  • 关于嵌入式学习——嵌入式硬件2
  • surveygo源码分析
  • “十五五”国家科技创新规划-建议
  • Pytorch笔记一之 cpu模型保存、加载与推理
  • 四维轻云:多期地理数据管理的得力助手
  • 【保姆级选型指南】2025年国产开源AI算力平台怎么选?覆盖企业级_制造业_国际化场景
  • 哈希表-271.存在重复元素-力扣(LeetCode)
  • Strapi 富文本内容转 HTML 页面显示:基于 marked.js 的完整实现方案
  • 在Spring Boot中使用H2数据库
  • 停止所有dcoker容器
  • Linux操作系统从入门到实战(二十四)进程控制
  • PixPin截图工具完全体下载|解决Snipaste无法长截图问题+比QQ截图更专业+无广告绿色版支持Win7-Win11全系统兼容
  • AssetStudio解包Unity游戏资源
  • 如何从PDF中高效提取表格数据
  • 什么是端到端保护?天硕工业级 SSD 固态硬盘怎么做?
  • ansible中配置并行以及包含和导入
  • burpsuite攻防实验室-JWT漏洞
  • 【机器学习学习笔记】线性回归实现与应用