艾莉同学教你初识指针
柠好Ninghao 2024-08-28 10:35:02 阅读 97
一、知识准备🥳
1.内存和地址🤔
首先我们需要将内存和硬盘进行区分,内存往往较小,可能8~32G。硬盘往往较大,可能512G或者更大。
我们可以将内存视为一个快递站,我们往往是根据快递号码分区寻找自己的快递的,这提高了寻找的效率。而内存同样被划分为一个个内存单元,每个内存单元的大小是一个字节(1Byte)。1Byte等于8bit,相当于一个快递区域存放8个包裹。
每个内存单元也有一个编号(可以视为快递区域的编号),有了编号,CPU(中央处理器)就可以快速找到内存空间。在计算机中,内存空间的编号叫做地址。在C语言中,地址叫做指针。
如图:
2.理解编址😵💫
首先,计算机中有许多的硬件,这些硬件是需要进行协同工作的,至少是进行数据的传递。硬件之间的数据传递是通过“线”实现的,CPU和内存之间也需要进行数据传递,可以看上图进行理解。
假设CPU要访问某一字节空间,那必须知道该字节空间所在的内存单元,内存单元也就需要进行编址。但是字节的编址不是存储在内存中的,而是通过硬件的设计完成。
它的本质是一种约定的共识!相当于一把乐器的各个按键被设计在不同的位置,但并没有进行标识,演奏者依然可以找出对应的发音位置。所以硬件已经固定化好了内存单元的地址。
拓展硬件的编址😗
在32位机器中有32根地址总线,这些地址总线是物理意义上的,每一根地址总线有两种状态(1和0),分别表示电脉冲的有无,所以一根线就可以传达两种信息,依次类推n根地址总线就可以传达2的n次方种信息,而每一个信息代表一个地址。
地址信息的传递是通过地址总线进行传递,在内存中找到对应的的内存单元的信息,再通过数据总线传给CPU。
现在我们假设CPU需要向内存读一个数据,就会通过地址总线传递地址信息找到对应的内存单元,控制总线传达读的操作。对应的信息通过数据总线传到CPU里。数据在CPU里经过一系列的操作后,如果需要存在内存中,控制总线就会传达写的信息,数据就会通过数据总线进行传递,所存的地址信息会通过地址总线进行传递。
到这里我们一直是在为后面的指针进行理论准备,难免有些唠叨了😵💫,别急我们马上进入正题!😆
二、 正文😍
1.取地址操作符(&)🤗
在C语言中,创建变量实际上就是向内存申请一块内存空间,如图:
我们创建了int型的变量a,向内存申请了4个字节的空间,如图可知a的地址是4个字节中地址最小的字节的地址。
因为整型变量占用4个字节的地址是连续的,我们只要知道第一个字节的地址,按顺序我们就能找到4个字节的地址。
依靠取地址操作符(&),我们就可以按照如图所示得到a的地址。
2.指针变量🤠
指针变量就是用来存放指针的变量。可以类比n存储了一个值20,p存储了一个地址(指针)来理解。
3.拆解指针类型🥰
上图中p的类型就是int*,但是如何理解呢?这里我们分两部分进行理解。
*代表p是指针int代表p指向的类型是整型
4.解引用操作符(*)😃
解引用操作符又叫间接访问操作符。
在生活中,如果我们某一次在一个餐馆中感觉饭菜味道不错,下次还想去吃,我们就会记下餐馆的地址,以便下次可以找到位置。我们在上述操作中保存了地址,如果要对该地址中的值进行修改或拿取,我们就需要使用解引用操作符(*)。
我们可以通过下图的方式进行修改:
我们可以通过下图的方式进行拿取:
到这里我们难免会产生“我难道不可以对n直接进行修改吗”的想法,其实在这里我们提供了另一个修改值的途径,假设我们只得到一个地址,那通过地址我们就可以对值进行修改,所以指针是很有用滴!😎
5.指针变量的大小😘
指针变量是多大呢?
指针变量存放的是地址,地址存放所需要的空间大小就是指针变量的大小。
注意:指针变量的大小与类型无关,与平台有关!
6.指针变量的意义🤩
在上述中,我们发现指针变量的大小与类型无关,那为什么还要分类呢🤔,别着急,我们慢慢分析😊。
6.1指针的解引用🤔
依据以下的例子进行理解:
第一组:
很明显那4个字节全部改为了0!
第二组:
很明显只有1个字节改为了0!
现在进行分析,在第二组中我们把n的地址放在了pc里面,首先这里是可以放下的,只是类型不同,平台是相同的(这里我是使用的是VS2022,Debug,X64)。
所以我们不难看出指针类型决定在对指针进行解引用操作的时候访问几个字节。
6.2指针±整数😫
依据上图,我们发现指针类型决定指针加1或减1走多大距离。
当然,我们可以不止加1,加其他数字也可以,思路一样,这里我就不再多加展示了。😘
6.2void*指针(泛型指针)😗
void的意思是:无、空,void*是无具体类型的指针,我们并不知道它加减1访问几个字节,它可以接受任意类型的地址。
根据实例,将一个int类型的变量的地址传给(char*)类型的指针变量是会warning的!而(void*)不会存在这样的问题。
显而易见,void*类型的指针是不能进行指针运算的,它只有一种用途:接受不同类型数据的地址。
我们可以通过强制类型转换对void*类型的指针进行使用,如图:
经过以上分析,大家应该理解指针变量为什么是有意义了吧🤞
到这里我们的初识指针就结束了,当然指针的知识还没有完,我不会断更的,我们下期blog再见!🥳
请多多一键三连!😋如果有问题请各位大佬斧正!😝
上一篇: 【JavaScript】Js 的 btoa 和 atob 全局函数
下一篇: 出现 Caused by: java.net.UnknownHostException: jmenv.tbsite.net 解决方法(原理分析)
本文标签
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。