c语言初学者—指针在内存中的地址和大小

本文详细解释了内存、地址、指针变量的概念,包括内存单元的分配、地址的重要性、取地址操作符和解引用操作符的使用,以及在C语言中指针的类型和大小。通过实例展示了内存编址的基础概念和指针在数据操作中的灵活性。
摘要由CSDN通过智能技术生成

目录

1:内存和地址

   1.1内存

1.2地址 

2:指针变量和地址 

2.1取地址操作符( & ) 

2.2指针变量和解引用操作符( * ) 

2.2.1指针变量 

2.2.2如何拆解指针类型 

2.2.3解引用操作符 

2.3指针变量的大小

1:内存和地址

   1.1内存

    以生活举例子:内存如同一栋学生宿舍,每个宿舍都有独一无二的门牌号, 有了门牌号,可以快速找到宿舍。

1. 一楼     101  102  103  104   105  106  107……

2. 二楼     201  202  203  204   205  206  207……

3. ……

    如果把上面的例子对照到计算中,又是怎么样呢?

    我们知道计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中。那我们买电脑的时候,电脑上内存是8GB/16GB/32GB等,那这些内存空间如何高效的管理呢?   

    其实也是把内存划分为⼀个个的内存单元,每个内存单元的大小取1个字节。

    计算机中常见的单位(补充):⼀个比特位(bite)可以存储⼀个2进制的位1或者0 

         每个内存单元,相当于⼀个学生宿舍,⼀ 个字节空间里面能放8个比特位,就好比同学们住的八人间,每个人是⼀个比特位。 每个内存单元也都有⼀个编号(这个编号就相当于宿舍房间的门牌号),有了这个内存单元的编号,CPU就可以快速找到⼀个内存空间。                                                               生活中我们把门牌号也叫地址,在计算机中我们把内存单元的编号也称为地址。C语⾔中给地址起了新的名字叫:指针。 所以我们可以理解为: 内存单元编号 == 地址 == 指针                                                                                                         

1.2地址 

计算机内存编址基础概念

  1. 为什么需要编址
    • 计算机的内存中存储着大量数据,为了准确地访问或修改这些数据,我们需要给它们一个唯一的地址标识。
  2. 硬件层面的编址
    • 内存的编址不是通过软件记录每个字节的地址,而是在计算机硬件设计时就确定好的。
    • 类似于乐器上弦的位置,不需要标记,演奏者就知道如何找到正确的音符,这是因为设计和共识。
  3. 协同工作的硬件
    • 计算机中的不同硬件部分(如CPU和内存)需要协同工作,它们之间通过物理线路连接。
    • 这些线路允许硬件之间传递数据和指令。
  4. CPU与内存的连接
    • CPU通过一组特殊的线路——地址总线,向内存发送要访问的数据的地址。
    • 地址总线就像是一条条传输地址信息的“道路”。
  5. 地址总线的原理
    • 每条地址总线可以表示0或1两种状态,多条地址总线组合起来就可以表示非常多的不同地址。
    • 例如,32条地址总线可以同时工作来表示2的32次方(即超过40亿)个不同的内存地址。
  6. 数据访问的步骤
    • CPU使用地址总线告诉内存它想要访问哪个地址的数据。
    • 内存查找该地址,并将找到的数据通过另一条线路——数据总线,发送回CPU。
    • CPU接收到数据后,可以在其内部的寄存器中进行处理或存储。

2:指针变量和地址 

2.1取地址操作符( & ) 

       通过上面对内存和地址的理解,我相信你已经懂了,那么我们回归到c语言中,在c语言中创建变量就是向内存申请一块地址空间。 

       代码中整型变量a向内存申请了4个字节 ,用于存放整数10,其中每个字节都有属于自己独一无二的地址                                                                                       

       按照我画图的例⼦,会打印处理:0X000029F6 &a取出的是a所占4个字节中地址较小的字节的地 址。

       虽然整型变量占用4个字节,我们只要知道了第⼀个字节地址,顺藤摸瓜访问到4个字节的数据也是可行的。 

2.2指针变量和解引用操作符( * ) 

2.2.1指针变量 

那我们通过取地址操作符(&)拿到的地址是⼀个数值,比如:0x000029F6,这个数值有时候也是需要存储起来,方便后期再使用的,那我们把这样的地址值存放在哪里呢?答案是:指针变量中。 比如: 

 指针变量也是一种变量,这种变量用来存放地址的,存放在指针变量中的值都会被理解为地址

2.2.2如何拆解指针类型 

我们可以看到上面的 pa 的类型是 int * ,下面通过图片来描述 指针的 类型 

这⾥ pa 左边写的是 int ** 是在说明 pa 是指针变量,而前面的  int  是在说明 pa 指向的是整型(int) 类型的对象。 

以此类推  char 类型的对象用 char * 指针变量来存放 float 类型的对象 用 float * 指针变量来存放

2.2.3解引用操作符 

  1. 在C语言中,指针是存储变量内存地址的变量。
  2. 通过指针,我们可以间接访问和操作内存中的变量。
  3. 为了读取或修改指针指向的值,我们使用解引用操作符( * )
  4. 这样,只要我们知道变量的地址(即指针),就可以使用解引用操作符来访问或修改该变量的值。

 

  1. 上面代码中第47行就使用了解引用操作符, *pa 的意思就是通过 pa 中存放的地址,找到指向的空间, * pa其实就是a变量了;
  2. 所以* pa = 0,这个操作符是把 a 改成了 0 。
  3. 你们肯定在想,这里如果目的就是把a改成0的话,写成 a = 0; 不就完了,为啥非要使用指针呢?
  4. 其实这里是把 a 的修改交给了 pa 来操作,这样对 a 的修改,就多了⼀种的途径,写代码就会更加灵活。

2.3指针变量的大小 

总结:

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

  • 23
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值