C语言学习笔记之指针(一)

news2024/11/15 7:36:45

目录

什么是指针?

指针和指针类型

指针的类型

指针类型的意义

指针+-整数

指针的解引用

指针 - 指针

指针的关系运算

野指针

什么是野指针?

野指针的成因

如何规避野指针?

二级指针


什么是指针?

        在介绍指针之前,我们需要先对内存与地址有一个认识。

        内存:内存是计算机重要且珍贵的硬件资源,计算机上所有的程序的都是运行在内存中的。为了能够合理有效的使用内存,就把内存划分为一个个小的内存单元

        那么这个内存单元应该多大呢?

        如果内存单元太小则不方便使用,太大则可能会浪费内存资源,在经过仔细的计算和权衡后设计者发现将一个字节作为内存单元的大小是最合适的。

        划分好内存后,如何有效的访问到每个内存单元呢?

        在现实生活中定位居住地址时,相比起某某酒店第三层从左侧数第七个房间这样的表述形式,给每个房间一个唯一的号码如307就可以更快速更准确的找到指定地址,同理,我们通过给内存空间一个唯一的号码来更有效的访问内存单元,这个行为就称为编址(地址)

        那么应该如何编址,以及每个地址对应多大的空间?

        众所周知,计算机只能识别0,1这样的二进制数。对于32位的计算机而言一共有32根地址线(物理电线),每根地址线可以产生两种电信号:高电平和低电平。两种电信号分别对应二进制的0和1,32根地址线一共可以产生2^32种电信号,如下:

        00000000 00000000 00000000 00000000
        00000000 00000000 00000000 00000001
        ...
        11111111 11111111 11111111 11111111

经过仔细的计算和权衡后我们发现一个字节(一个内存单元)给一个号码是比较合适的,这些号码就被称为内存单元的地址。每一个地址可以维护一个内存单元,2^32个地址就可以维护2^32个内存单元(4GB),因此对于32位的机器而言,最大可以维护4GB的内存空间,同理可得64位机器最大可以维护2^64个字节的内存空间。

        什么是指针?

        指针是内存中一个最小单元的编号,即指针实际上就是地址。而我们平时口语中所说的指针,通常指的是指针变量,是用来存放内存地址的变量。

指针和指针类型

        指针的定义和初始化:

        指针的使用:

        指针的应用场景:

        1.有些时候我们无法直接使用变量名来操控想要控制的变量,从而使用指针来间接操控变量(传址调用)。

        2.可以节省空间,提高运行效率。

        函数传参的时候,参数是需要压栈的。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,就会会导致性能的下降,而指针大小只有4(32位)或8(64位)字节,因此在这种情景下传指针可以有效节省空间并提高运行效率。

        指针的大小:

        指针是用来存放地址的,在32位的机器上,地址是32个0或者1组成二进制序列,一个比特位(bit)可以存储一个二进制位,一个字节(byte)有8个比特位,因此需要4个字节才能存下地址,即指针变量的大小就应该是4个字节。同理可得在64位的机器上,指针变量的大小应该是8个字节。

        指针的大小在32位平台是4个字节,在64位平台是8个字节。

指针的类型

        众所周知,数值变量都是有类型的,如:char, int, float, double等,那么指针有类型吗?答案是有的。

指针类型的意义

        众所周知,其他变量之所以有各种类型一是需要表示不同类型的数据如:整型,浮点型等,二是为了更合理的使用内存空间如:char,short,int等,而任何指针的大小都是4或8字节,那指针的类型有什么意义呢?难道仅仅是为了表示所指向的变量是什么类型?

        指针的类型决定了指针的权限。

指针+-整数

        指针的类型决定了指针 +n(-n)前进(后退)多大的距离(zieof(类型) * n)。

指针的解引用

        指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。

指针 - 指针

        指针 - 指针的绝对值计算的是两个地址之间的元素个数。注:只有指向同一片空间且是同一类型的指针相减才有实际意义!

指针的关系运算

        指针是可以进行关系运算的:

sp:

        C语言标准规定:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较。

野指针

        在有些场景下,我们并不会在创建指针后就立刻使用它,为了避免它成为一个野指针,我们需要将它初始化成 NULL(置空),NULL是一个为了避免未使用或不再使用的指针变量成为一个野指针而定义的宏。

什么是野指针?

        概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)。通俗的讲,不知道明确指向的,指向非法空间的指针就是野指针。

        野指针可能带来的危害:

        1.指向不可访问的地址。危害:触发段错误。
        2.指向一个可用的,但是没有明确意义的空间。危害:程序可以正确运行,但通常这种情况下,我们就会认为我们的程序是正确的没有问题的,然而事实上就是有问题存在,所以这样就掩盖了我们程序上的错误。
        3.指向一个可用的,而且正在被使用的空间。危害:如果我们对这样一个指针进行解引用,对其所指向的空间内容进行了修改,但是实际上这块空间正在被使用,那么这个时候变量的内容突然被改变,当然就会对程序的运行产生影响,因为我们所使用的变量已经不是我们所想要使用的那个值了。通常这样的程序都会崩溃,或者数据被损坏。

        总而言之,野指针的危害极大!!!

野指针的成因

1.指针未初始化就直接使用

2.指针的越界访问

3.指针指向的空间已经释放

如何规避野指针?

        1. 指针初始化。

        2. 小心指针越界
        3. 指针指向空间释放,及时置NULL
        4. 避免返回局部变量的地址
        5. 指针使用之前检查有效性

二级指针

        众所周知,指针变量也是变量,而变量都是有地址的,所以指针变量也有地址。我们把指向普通类型(非指针类型)变量的指针变量称为一级指针,把指向一级指针的指针变量称为二级指针,即二级指针是用来存放一级指针的地址的。三级指针同理。

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

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

相关文章

使用Pyecharts构建Map对象无法显示颜色--解决

我们在做数据可视化的过程中,可能需要使用到地图作为数据可视化的工具; 包括世界地图、国家地图、省市区地图等; 如果在你设置好颜色数据匹配后,可视化地图未显示对应数据的颜色,那么请检查是否出现以下情况&#xf…

Hadoop运行wordcount实例任务卡在job running的多种情况及解决方法

第一种:配置问题 这是别人的图片,据楼主排查解决是因为hosts配置问题… 现象:各种无法运行、启动 解决办法: 1、修改日志级别 export HADOOP_ROOT_LOGGERDEBUG,console 查看下详细信息,定位到具体问题解决 第二种&…

【JavaSE】/*类和对象(上)*/

目录 一、什么是类,什么是对象 二、类和对象的关系 三、学习类和对象的目的 四、怎样创建一个类 4.1 语法形式 4.2 创建示例 示例一:日期对象 示例二:小狗对象 示例三:学生对象 4.3 注意事项 4.4 修改public修饰的主类…

Day06:Flex 布局

目标:熟练使用 Flex 完成结构化布局 一、标准流 标准流也叫文档流,指的是标签在页面中默认的排布规则,例如:块元素独占一行,行内元素可以一行显示多个。 二、浮动 1、基本使用 作用:让块元素水平排列。 …

如何学习计算机网络(超详细,方法论)

分享一下学习计算机网络的方法论 首先是看视频: 这里我推荐中科大郑烇、杨坚全套《计算机网络(自顶向下方法 第7版》课程 课程目标_哔哩哔哩_bilibili 教材采用神书《计算机网络(自顶向下方法)》,授课风格更偏向实…

The view model in Acise

在FreeCAD中,借助于Boost Signals2实现了业务层、显示层的分层,但整个FreeCAD Gui层却采用了Coin3D进行渲染,很难进行在这方面进行扩展。 相较之下,在SALOME中,可以为不同的Module指定特定的ViewModel,支持…

uniapp App去除iOS底部安全区域白边

未设置的情况下,iOS底部安全区域白边 如图: 去除方法: 在 mainfest.json 中加入一下代码: "safearea" : {"bottom" : {"offset" : "none"} }, 去除效果展示:

翻译AnyDoor: Zero-shot Object-level Image Customization

摘要 本研究介绍了AnyDoor,这是一款基于扩散模型的图像生成器,能够在用户指定的位置,以期望的形状将目标对象传送到新场景中。与为每个对象调整参数不同,我们的模型仅需训练一次,就能在推理阶段轻松地泛化到多样化的对…

能找伴侣的相亲婚恋平台有哪些?6款值得信赖的恋爱交友软件体验测评

在这个超快节奏的社会里,好多人都忙着搞事业和搞钱,却把终身大事给忽略了。但是随着年龄越来越大,来自长辈和社会的压力也越来越大,因此网络上的相亲交友软件,就成了大多数单身贵族的脱单首选了。下面就来给大家讲讲我…

C#的奇技淫巧:利用WinRM来远程操控其他服务器上的进程

前言:有时候远程服务器的进程你想偷偷去围观一下有哪些,或者对一些比较调皮的进程进行封杀,或者对一些自己研发的服务进行远程手动启动或者重启等,又不想打开远程桌面,只想悄咪咪地执行,那也许下面的文章会…

重开之数据结构(二刷)

引言: 由于前段时间学习效率不高,导致后面复习前面数据结构没有一个大纲,因此打算重新来学习以下数据结构,期望再次把数据结构学透,并有深刻的印象.并且记录每一次的学习记录 以便于后续复习 二分查找 需求:在有序数组arr内,查找target值 如果找到返回索引位置如果找不到返回…

详细分析Element中的MessageBox基本知识(附Demo)

目录 前言1. 基本知识2. Demo2.1 确认框2.2 警告框2.3 对话框 3. this.$confirm 前言 详细知识推荐阅读:详细分析Element Plus中的ElMessageBox弹窗用法(附Demo及模版) MessageBox则常用于Vue2 1. 基本知识 MessageBox 是 Element UI 提供…

《欢乐钓鱼大师》辅助:新手钓鱼全新攻略大全!

《欢乐钓鱼大师》是一款充满趣味和挑战的钓鱼游戏。在游戏中,玩家不仅可以体验钓鱼的乐趣,还可以通过不同的钓鱼竿和鱼卡来提升自己的钓鱼技能。为了帮助新手和老玩家更好地体验游戏,本文将为您提供详细的游戏攻略。 1. 游戏目标 在《欢乐钓…

window环境下QT5开发环境的搭建

1、安装visual Stusio 15 生成工具2012 2、安装Visual studio Enterprise 2017 3、Visual studio Enterprise 2017安装完成之后, 修改:选择桌面调试,如下: 4、打开QTcreator,选项中,配置编译器&#xff…

详细分析tcping的基本知识以及用法

目录 前言1. 安装配置2. 基本知识3. Demo 前言 针对ping的基本知识推荐阅读:详细分析ping的基本知识以及常见网络故障的诊断(图文解析) 1. 安装配置 针对Window的下载如下: 安装路径:tcping官网 下载tcping.exe&a…

2024最新 Jenkins + Docker实战教程(一) - Jenkins介绍及安装

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

pytorch笔记:torch.nn.Flatten()

1 介绍 torch.nn.Flatten(start_dim1, end_dim-1) 将一个连续的维度范围扁平化为一个张量 start_dim (int)要开始扁平化的第一个维度(默认值 1)end_dim (int)要结束扁平化的最后一个维度(默认值 -1) 2 举例 input torch.ra…

PyTorch基础(22)-- torch.chunk()方法

分享一下自己目前在维护的Github项目,由于本人博士阶段接触了一个全新的研究方向-----使用机器学习、强化学习、深度学习等方法解决组合优化问题,维护这个项目的目的: (1)记录自己阅读过的paper,同时分享一…

Attention相关问题笔试解析。

Attention相关问题笔试解析。 题目描述一:【选择】题目描述二:【简答】题目描述三:【代码】Scaled Dot-Product Attention:下面是用PyTorch实现的一个Attention机制的代码。这个实现包括一个简单的Scaled Dot-Product Attention机…