首页 > 其他分享 >初识指针 1.0

初识指针 1.0

时间:2024-07-15 21:58:54浏览次数:17  
标签:1.0 变量 指向 数据类型 地址 初识 内存 指针


前言

各位宝子们,想象一下你家的信箱。信箱里装着各种信件和包裹,每个信箱都有一个唯一的地址。现在,你手里拿着一张纸条,上面写着某个信箱的地址。这张纸条就像是指针,它并不是信件本身,而是告诉你在哪里可以找到这个信件。

在计算机编程中,变量就像是那些放在信箱里的信件或包裹,而指针则是用来指向这些变量的地址的东西。通过指针,我们可以找到并操作这些变量,就像你用地址纸条找到并取出对应的信件一样。


一、指针的组成

指针其实是一个地址,它是内存单元的一个编号。

由上面的代码,我们可以看到指针是由四个部分组成的,我们可以以 int* p=&a 这个代码为例子。

*表示p是一个指针变量,int表示这个指针变量所指向的内容是个整型类型,p则是这个指针变量的名字,&这是用来取指针所指向内容的地址。

* 在计算机中有好几种说法:在a*b中,*表示的是四则运算中的乘法运算;而在指针中*p,*叫做解引用操作符,它的作用顾名思义就是将指针(地址)解放再引用,*p这时候是一个数值。

&在计算机中同样有好几种说法:在a&b中,&表示的是按位操作符中的按位与即在对应的二进制中两个中只要有一个0就为0,只有两种都为1才为1;而在指针中,&a表示的是取出a的地址,然后再赋值给指针。

注意:p==&a(它们是一个地址);*p==a(它们是一个值);&p是一个地址,它表示的是a的地址的地址

二、指针的意义

1.指针变量中数据类型的意义

*是通过地址(指针)找到地址所指向的对象。而*前面修饰的数据类型不同,*发挥的作用也是有所不同的。我们根据前面所学的知识应该都知道了每种数据类型在内存中所占的字节数都是不同的:例如int在内存中中占4个字节数,char在内存中只占1个字节数,故当指针+-某个数字时,它会根据前面的数据类型,前进或者后退多少个字节数;除此之外,数据类型还决定了解引用操作符(*)的权限(一次能操作几个字节)

ps:%p是用来输出地址的占位符,在内存中地址是以16进制存储的

除了一些基本的数据类型(int,char,flaot,double....)还有void*指针,这是一种特殊的指针,它是一个无具体类型的指针(也叫泛型指针),这种类型的指针可以用来接收任意类型地址。但是它也有局限性,void*类型的指针不能直接进行指针的+-整数和解引用操作。

2.指针变量大小意义

我们前面已经知道,指针是一个地址,指针也分为各种类型,那么它们的大小将如何判断呢?难道是根据前面的数据类型来判读吗?NO,NO,NO这时候咱们就太死板了,其实指针变量的大小与它的类型无关,而是跟它的环境有关


三、指针的运算

1·指针+-整数

我们知道数组在内存中是连续存放的,故只要知道第一个元素的地址,顺藤摸瓜就能找到后面所有的元素

其中 p+i是跳过i*sizeof(数据类型)个字节

2·指针-指针

指针-指针的绝对值是指针和指针之间元素的个数(注意仅指的是个数,而不是字节数),但是指针-指针还有一个前提条件就是两个指针必循指向同一个内存空间。下面我们可以来通过一个例子来进一步了解一下。

3·指针的关系运算

其实指针也可以像数字那样进行关系运算,但是两个指针要相同类型噢,例如下面的例子

四、野指针

首先让我们了解一下,何为野指针?野指针就是指针指向的位置是不可知的(随机的,不正确的,没有明确限制的)

1.野指针的成因

1.1指针未初始化

1.2指针越界访问

1.3指针指向的空间释放

2.如何规避野指针

2.1指针初始化

如果明确知道指针指向哪里就直接赋值地址,如果不知道指针应该指向哪里,可以给指针赋值NULL。NULL是C语言中定义的一个标识符常量,值是0,0也是地址,但是这个地址是无法使用的,读写该地址会发生报错

2.2小心指针访问过界

2.3避免返回局部变量的地址

由于局部变量一个只能在某个函数体内使用,之后可能会被释放掉,因此尽量避免返回局部变量的地址

五、const修饰指针变量和assert断言

一般来说const放在指针变量中*的左右两边意义是不同的。

在计算机编程中,assert 是一种常用的调试和错误检测工具,它用于在程序运行时检查一个条件是否为真。如果条件为假(即断言失败),assert 会导致程序终止,并在调试模式下显示出错信息,帮助开发人员找到问题所在。注意:在使用assert断言语句的时候不要忘记加上#include<assert.h>

  1. 断言的意义

    • 调试工具assert 主要用于在开发阶段检测程序中的逻辑错误和不合理的假设。
    • 提高代码可靠性:通过在关键位置添加断言,可以确保程序在运行时符合预期条件,减少因错误条件导致的异常行为或崩溃。
    • 快速定位问题:一旦断言失败,程序会立即中止,并显示具体的出错信息(例如断言所在的文件、行号等),帮助开发人员快速定位和修复问题

最后再补充一个指针的小运用:传址调用

标签:1.0,变量,指向,数据类型,地址,初识,内存,指针
From: https://blog.csdn.net/H2X7_/article/details/140381250

相关文章

  • AcWing 2074:倒计数 ← 双指针算法
    【题目来源】https://www.acwing.com/problem/content/2076/【题目描述】艾弗里有一个由N个正整数构成的数组。数组中的第i个整数是Ai。如果一个连续的子数组的长度为m,并且按顺序包含整数m,m−1,m−2,…,2,1,则称它为m倒计数。例如,[3,2,1]是3倒计数。请帮助艾......
  • 双指针 & 双向搜索
    双指针根据人类直觉这个东西需要满足单调性,所以预处理的时候大概率需要排序。好像常与二分结合使用?可以用在序列、链表(存储位置)或者树、图上(存储结点)。或者用于其他算法(eg:单调队列、差分),还有主播没学过的莫队。正题顾名思义双指针是两个指针,通常是外层一个内层一个(依靠相对......
  • 小白初识之C语言二
    重构:不增加代码功能,对代码结构的调整和优化,为了维护和拓展1.流程控制-顺序结构-分支结构(判断\选择)-循环结构2.分支-if-ifelse(三元运算替代)-ifelseifelseifelse(多路分支)-switch-case多路分支,有限,简洁3. 数组-一个标识符,存储多个值(大小是......
  • 初识PCB过孔
    PCB过孔:连接电路世界的微小桥梁在电子制造业的浩瀚星空中,PCB(PrintedCircuitBoard,印刷电路板)无疑是那颗最耀眼的星辰之一。作为电子设备的核心组成部分,PCB承载着电子元器件的互联与通信重任。而在这错综复杂的电路网络中,PCB过孔(Via)则扮演着至关重要的角色,它们如同微小的桥......
  • 初识铺铜与切铜
    铺铜和切铜是PCB(PrintedCircuitBoard,印刷电路板)设计中的两个重要步骤,它们各自具有特定的目的和操作方法。铺铜定义:铺铜是指在PCB电气层上添加整块的铜皮,用以填充没有布线的区域或闲置的空间。这些铜区也被称为灌铜或敷铜。铺铜是PCB设计中的一个重要环节,对于提高电路板......
  • [Windows] 大佬基于Splayer二次开发 TuneFree v1.0.8便携版
    描述对于经常在互联网上进行操作的学生,白领等!一款好用的软件总是能得心应手,事半功倍。今天给大家带了一款高科技软件TuneFreev1.0.8便携版无需额外付费,永久免费!亲测可运行!!内容目前主要的内容以资源破解,对于学习破解资源有比较大的帮助!但是网络上面错综复杂,很多老......
  • C语言指针
    指针引用与指针引用&指针*必须初始化可以不初始化不能为空可以为空不能更换目标可以更换目标初始化案例int&r;//不合法,没有初始化引用int*p;//合法,但p为野指针,使用需要小心(1)是否需要初始化由于引用不能为空,所以我们在使用引用的时候......
  • 数组002 一维数组与指针
    #include<iostream>usingnamespacestd;//1、指针的算术://将一个整型变量加1后,其值将增加1。//但是,将指针变量(地址的值)加1后,增加的量等于它指向的数据类型的字节数。////2、数组的地址//2.1数组在内存中占用的空间是连续的。//......
  • RaftKeeper v2.1.0版本发布,性能大幅提升!
    RaftKeeper是一款高新能分布式共识服务,完全兼容Zookeeper但性能更出色,更多关于RaftKeeer参考Github,我们将RaftKeeper大规模应用到ClickHouse场景中,用于解决ZooKeeper的性能瓶颈问题,同时RaftKeeper也可以用于其它大数据组件比如HBase。v2.1.0作为v2.0.0后的重要版本,引入了一系列新......
  • 【JVM_01】——初识JVM运行流程
    目录1-引言:初识JVM1-1JVM是什么?(What)1-1-1概念1-1-2优点1-2为什么学习JVM?(Why)2-核心:JVM工作的原理(How)⭐2-1JVM的组成部分及工作流程2-2学习侧重点3-小结(知识点大纲):3-1JVM组成3-2类加载器3-3垃圾回收3-4JVM实践1-引言:初识JVM1-1JVM是什么?(......