指针(一)

发布于:2024-07-08 ⋅ 阅读:(43) ⋅ 点赞:(0)

一 . 内存和地址

在讲解指针之前,我们先来做一些铺垫,帮助大家更好地理解

有关于计算机中内存的概念,我先来给诸君举个例子:

比如说我们在宿舍或者家里点外卖,我们肯定会给外卖员一个详细地址包括我们的门牌号是吧,不然外卖员挨个挨个房间去找,效率是不是就非常低了,但当我们给到他一个非常详细的地址,例如一栋二单元202这样子的

当我们将这种类似门牌编号的例子对照到我们的计算机里,它是怎样的形式呢?

计算机中,CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回到内存当中去。那在我们买电脑的时候,电脑上内存是 8GB / 16GB / 32GB 等,那这些内存空间是如何高效管理的呢?这就跟我们上面举的例子差不多,把内存有规律的划分为一个又一个的内存单元,每个内存单元的大小取 1 个字节(一个比特位可以储存一个二进制的 1 或 0

在我们的日常生活中,我们把门牌号叫做地址,在计算机中我们将内存单元的编号也叫地址,在我们的C语言中,将地址称为——指针

我们的CPU在访问内存中的某个字节空间时,就必须知道这个字节空间在内存的什么位置,但内存中的字节实在是太多了,我们就需要给内存编号

首先,大家要 get 到一点的就是,计算机内是有很多硬件单元的,而硬件单元是要互相协同工作的,这里所谓的协同工作,指的就是硬件单元相互之间能够进行数据传递

但是我们的硬件单元之间是相互独立的,怎样去实现我们所谓的数据交流呢?很简单,那就是通过  “ 线 ” 将它们串联起来的

CPU和内存之间有着大量的数据交互,所以这两者之间也是有 “ 线 ” 的

今天我们来认识一种线——地址总线

我们可以简单地理解为:

32位机器有32根地址总线,每根线只有两态:表示为 0 ,1 (电脉冲有无),由此可见,一根线就能表示 2 种含义,2 根线就能表示 4 种含义,以此类推,32 根线就能表示 2^32 种含义,每一种含义都代表一个地址

我们的地址信息被下达给内存,在内存上就可以通过该地址找到对应的数据,再将数据通过我们的数据总线传入CPU内寄存器 

二 . 指针变量和地址

(1)取地址操作符

理解了内存和地址的关系,我们再回C语言当中来,在我们C语言中,创建变量实质就是向内存申请空间的操作,如:

上述代码我们创建了一个整型变量 a ,并向内存中申请了四个字节,用于存放整数 10 ,其中每个字节都有地址,那么我们如何获取 a 的地址呢?这就得运用到我们的取地址操作符—— & ,如图:

我们打印出来的就是 a 的地址(这是86位编译环境下的,所以较短),&a 取出来的是 a 所占 4 个字节的地址,虽然整型变量占了 4 个字节,但我们只要知道了第一个字节的地址,就可以顺藤摸瓜访问到 4 个字节的数据

三 . 指针变量、类型和解引用操作符 * 

(1)指针变量

当我们通过取地址操作符 & 拿到的地址是一个数据,例如:0 x 0 0 1 f f f 0 1 ,为了方便我们使用,这个数据有时候也是需要储存起来的,我们会将它存放在指针变量中,例如:

(指针变量也是一种变量,这种变量是专门用来存放地址的,存放在指针变量中的值都会被判定为地址

(2)指针类型

在我们上方提到的用的是 int * pf = &a,这里我们 pf 就我们自定义的一个名字,而 pf 的类型就为 int *,大家可以简单地将其理解为去掉指针名字,剩下的就是指针类型,这样没一点儿毛病昂,* 就是说明 pf 指向的是一个指针变量,int 也就是说明我们指针指向的是一个整型类型的对象,也就是我们上图的 a 

同理,我们如果有一个 char 类型的变量 ch,ch 的地址,就应当放到 char * 类型的指针变量当中:

(3)解引用操作符

如图,在上述代码的第10行对其进行了解引用操作,* pf 的意思就是,通过我们之前在 pf 中存放的地址,找到其指向的空间,然后再将其赋值为 0 

这个时候就有小伙伴要问了,这不是多此一举么,我们明明可以直接写 a = 0 ;为什么还这样子来绕一下呢?Good question ! 这里我们将 a 的修改交给了 pf 来操作,这样对 a 的修改就多了一种途径,我们编写的代码就能够更加灵活,这一点我们到了后期遇到复杂代码的时候就会深有体会

四 . 指针变量的大小

在上面我们提到过,32位机器假设有32根地址总线,每根地址线出来的电信号转化成数字信号后是 1 或 0 ,那我们把32根地址线产生的二进制序列当做一个地址,那么一个地址就是32个bit位,需要4个字节才能储存

如果指针变量是用来存放地址的,那么指针变量的大小就得是4个字节的空间才可以

同理64位机器,假设有64根地址线,一个地址就是64个二进制组成的二进制序列,储存起来就需要8个字节的空间,指针变量的大小就是8个字节

这是x86环境下(32位)

这是x64环境下(64位)

总结:

32位平台 下地址是32个bit位,指针变量大小是 4个字节
64位平台 下地址是64个bit位,指针变量大小是 8个字节
注意指针变量的大小与类型是无关的,只要 指针类型的变量,在相同的平台下,大小都是相同的

 

OKK,有关指针的第一小节今天就到此为止,指针这一部分在C语言中相当相当重要,也相当难理解,相对来说较为抽象,但我相信诸君都是聪明人,只要勤加练习,我相信大家一定能拿捏它!就这样咯,咱们下期再见。与诸君共勉!!!


网站公告

今日签到

点亮在社区的每一天
去签到