C语言深入理解指针二(15)

news2024/11/13 9:40:59

文章目录

  • 前言
  • 一、指针变量类型的意义
    • 指针的解引用
    • 指针+-整数
    • void*指针
  • 二、const修饰指针
    • const修饰变量
  • 三、指针运算
    • 指针+-整数
    • 指针-指针
    • 指针比较大小
  • 四、野指针
    • 野指针成因
    • 如何规避野指针
  • 总结


前言

  本节课开始上点有意思的内容了!


一、指针变量类型的意义

指针的解引用

对比下面2段代码,我们在调试时观察内存的变化
在这里插入图片描述
调试我们可以看到,代码1会将n的4个字节全部改为0,但是代码2只是将n的第一个字节改为0
在这里插入图片描述
在这里插入图片描述

结论:指针的类型确定了,对指针解引用的时候就会有多大的权限(即一次能够操作几个字节)
比如 char* 的指针就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节,所以,就算每个指针变量的大小都是4/8个字节,但是我们仍然要注意类型

存在即合理,C语言既然给变量也设置的类型,就一定有它的理由

指针±整数

先看一段代码,我们调试来观察地址的变化
在这里插入图片描述
代码运行结果如下:
在这里插入图片描述
我们可以看出,char类型的指针变量+1跳过1个字节,int类型的指针变量+1超过了4个字节,这就是指针变量的类型带来的变化
结论:指针的类型决定了指针向前或者向后走一步有多大(距离)

void*指针

在指针类型中有一种特殊的类型是 void* 类型的,可以理解为无具体类型的指针(或者叫做泛型指针),这种类型的指针可以用来接受任意类型地址,但是也有局限性, void* 类型的指针不能直接进行指针的±整数和解引用的运算(因为不知道具体可以操作的字节数)
来个例子:
在这里插入图片描述
上述代码中,将一个int类型的变量的地址赋值给一个char类型的指针变量,编译器给出了一个警告,是因为类型不兼容,而使用void类型就不会有这样的问题
那么 void* 类型的指针有什么用呢?
一般 void* 类型的指针是使用在函数参数的部分,用来接受不同类型数据的地址,这样的设计可以实现泛型编程的效果,使得一个函数来处理多种类型的数据,这点,我们后面会单独介绍,相信我,这会让你感慨真酷!

二、const修饰指针

const修饰变量

变量是可以修改的,如果把变量的地址交给一个指针变量,通过指针变量的也可以修改这个变量
但是如果我们希望一个变量加上一些限制,不能被修改,这该怎么做呢?答案是采用const修饰符
在这里插入图片描述
上述代码中,n是不能被修改的,其实n本质是变量,只不过被const修饰后,在语法上加上了限制,只要我们在代码中对n进行修改,就不符合语法规则,就报错,致使我们没法直接修改n
但是我们绕过n,使用n的地址,去修改n就能做到了,虽然这样做是在打破语法规则

const修饰指针的时候
const可以放在的左边
const可以放在
的右边
也就是说,const int* pa 和 int* const pa都是可以的
但是它们限制的不太一样,前者限制的是*pa,后者限制的是pa
如图:
在这里插入图片描述

哦对了,插一个小知识,这一定要搞清楚
1.p指向a,p里面存放的是a的地址
2.p是变量,有自己的地址
3.*p是p指向的空间

我们再回来研究这个const修饰
1.第一个const修饰 *p ,意思是不能通过 p 来修改 p 指向的空间的内容,但是 p 是不受限制的
2.第二个const修饰 p ,意思是 p 变量不能被修改了,没办法再指向其他变量了,但是 *p 不受限制,还是可以通过p来修改p所指向的对象的内容
3.当然还有 * 左右都限制,这时候 p 和 *p 都被限制了

三、指针运算

指针±整数

因为数组在内存中是连续存放的,只要知道第一个元素的地址,顺藤摸瓜就能找到后面的元素
在这里插入图片描述
在这里插入图片描述

指针-指针

在这里插入图片描述
结论:指针-指针的绝对值是指针和指针之间的元素个数,前提是两个指针指向同一块空间

指针比较大小

先插个小知识,arr数组名其实是数组首元素的地址,arr就等价于arr == &arr[0];
在这里插入图片描述

四、野指针

  概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

野指针成因

1.指针未初始化
在这里插入图片描述
2.指针越界访问
在这里插入图片描述
3.指针指向的空间释放
在这里插入图片描述
地址确实返回来了,可是从函数出来,a的内存空间就还给操作系统了,这时候你还找出这个空间,甚至还想访问它

如何规避野指针

1.指针记得要初始化,指向谁要清楚,如果一开始不知道要指向谁,就指向空指针NULL

NULL是C语言中定义的一个标识符常量,值是0,0也是地址,这个地址是无法使用的,读写该地址会报错

2.小心指针越界
要明白指针只能访问哪些空间,不能超出范围访问

3.指针变量不再使用的时候,及时置NULL,指针使用之前检查有效性
当指针变量指向一块区域的时候,我们可以通过指针访问该区域,后期不再使用这个指针访问空间的时候,我们可以把该指针置为NULL

把野指针想象成一条野狗,野狗放任不管是非常危险的,所以我们可以找一棵树把野狗栓起来,就相对安全了,>在使用前,我们就要判断一下是否为NULL
在这里插入图片描述

4.避免返回局部变量的地址


总结

  本章开始已经有点意思起来了,但是难的还在后面!

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

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

相关文章

Spark 集群进行 ETL 的架构介绍

一 什么是ETL ETL(extract提取、transform转换、load加载)。ETL负责将分散的、异构数据源中的数据如关系数据、平面数据文件等抽取到临时中间层后,进行清洗、转换、集成,最后加载到数据仓库或数据集市中,成为联机分析…

论文速读|通过 SERL 算法优化轻量级双足机器人结构

论文地址:https://arxiv.org/pdf/2408.15632 这篇论文展示了SERL算法在双足机器人结构参数设计中的有效性,提供了推进该领域的重要见解。通过结合强化学习运动控制策略和进化算法,SERL算法成功识别出在指定设计空间内最能满足任务要求的结构…

GO语言性能分析

Go语言基准测试与pprof工具性能分析详解 在现代软件开发中,性能优化是一个重要的环节。Go语言提供了强大的工具来进行基准测试和性能分析,其中 testing 包用于基准测试,而 pprof 工具用于性能分析。本文将详细讲解如何使用这些工具来进行性能…

如何快速构建RTMP直播推送业务场景?

大牛直播SDK跨平台RTMP直播推送模块,始于2015年,支持Windows、Linux(x64_64架构|aarch64)、Android、iOS平台,支持采集推送摄像头、屏幕、麦克风、扬声器、编码前、编码后数据对接,功能强大,性能…

美术|基于java+vue的美术外包管理信息系统(源码+数据库+文档)

美术管理信息系统 目录 基于javavue的美术资源管理系统 一、前言 二、系统设计 三、系统功能设计 系统功能模块 管理员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码农…

基于JAVA+SpringBoot+Vue的前后端分离的图书馆管理系统

基于JAVASpringBootVue的前后端分离的图书馆管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接&#…

【408 数据结构】第2章 线性表

文章目录 线性表考纲线性表的定义和基本操作1. 定义2. 线性表的基本操作 线性表的顺序表示1. 顺序表的定义2. 顺序表基本操作的实现初始化插入-时间复杂度O(n)删除-时间复杂度O(n)按值查找-时间复杂度O(n) 线性表的链式表示1. 单链表的定义2. 单链表基本操作的实现单链表的初始…

计算机毕业设计选题推荐-自驾游攻略管理系统-Java/Python项目实战

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

usb-ss 与 pcie 协议欣赏 --- linux kernel 欣赏

我们先来看usb ss phy , 然后看pcie phy. 我们先来看一下 usb ss phy 的第一条初始化通路. 这是基础设施的构建,这对应着系统启动时usb ss phy一系列稳定性问题 . 一看到probe函数,好啊,它是一切的根. 所谓的无源之水无本之木,这…

C++设计模式——Memento备忘录模式

一,备忘录模式的定义 备忘录模式是一种行为型设计模式,它允许将对象的状态保存在外部,并在需要时恢复。 备忘录模式允许在不破坏封装性的前提下,捕获并存储一个对象的内部状态,并在需要时将其恢复到之前的状态。 在…

IT前端好用的工具集

在线抠图网站 https://www.remove.bg/ 将iconfont转成css显示 https://transfonter.org/ 免费的在线图片压缩 https://tinypng.com/ JSON在线格式化工具 https://www.sojson.com/ 国内人工智能kimi.moonshot工具 https://kimi.moonshot.cn/chat/crft7a6sdv14grouufs0 自动…

2024年录屏神器大盘点,轻松捕捉屏幕精彩

现在讲解一些操作越来越便捷了,我 一般都是用录屏工具来边录制操作边讲解,这样可以更方便对方了解操作步骤。这次我就分享几款免费录屏工具一起来试试吧。 1.福晰录屏软件 链接:www.foxitsoftware.cn/REC/ 对于初次尝试录屏的新手来说&…

java语言发展史

Java语言的发展史是一部丰富多彩的科技演进史,它从一个简单的项目逐渐成长为全球范围内广泛使用的高级编程语言。下面,我将带您简要回顾Java的发展历程。 起源:Oak阶段(1991-1995) Java的前身是Oak,由詹姆斯…

【软考】设计模式之责任链模式

目录 1. 说明2. 应用场景3. 结构图4. 构成5. 适用性6. 优点7. 缺点8. java示例 1. 说明 1.使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。2.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为…

【漏洞复现】易天智能eHR CreateUser 任意用户添加漏洞

免责声明: 本文内容旨在提供有关特定漏洞或安全漏洞的信息,以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步,并非出于任何恶意目的。阅读者应该明白,在利用本文提到的漏洞信息或进行相关测…

81页PPT产业园5G多功能智慧灯杆整体规划设计方案

学习9000多份智慧城市,智慧医院,智能制造,数字化转型,新质生产力,算力,大模型,AIGC,工业互联网,数字孪生......持续更新热点行业解决方案,公号智慧方案文库。…

计算机网络 --- 【2】计算机网络的组成、功能

目录 一、计算机网络的组成 1.1 从组成部分看 1.2 从工作方式看 1.3 从逻辑功能看 1.4 总结 二、计算机网络的功能 2.1 数据通信 2.2 资源共享​编辑 2.3 分布式处理 2.4 提高可靠性 2.5 负载均衡 一、计算机网络的组成 1.1 从组成部分看 我们举例分析计算机网络从…

Mistral.rs开源大语言模型(LLM)推理平台兼容OpenAI API,通过HTTP服务器和Python绑定

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

十、组合模式

组合模式(Composite Pattern)是一种结构型设计模式,它允许将对象组合成树形结构来表示“部分-整体”的层次关系。组合模式能够让客户端以统一的方式对待单个对象和对象集合,使得客户端在处理复杂树形结构的时候,可以以…

读者来信:《人机环境系统智能》读后感

一、什么是智能? 当“人工智能”火爆出圈乃至登堂入室,上升为国家战略层面后,尽管我们每天都把人工智能挂在嘴上,但好像似乎忘了问一句:什么是智能?经过一番在哲学上对控制论、信息论、系统论在哲学上的追根…