艾莉同学教你初识指针

一、知识准备🥳

在这里插入图片描述

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*,但是如何理解呢?这里我们分两部分进行理解。

  1. *代表p是指针
  2. 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再见!🥳

请多多一键三连!😋如果有问题请各位大佬斧正!😝
在这里插入图片描述

  • 15
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值