首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >指针及其操作符、内存、编址与地址的理解

指针及其操作符、内存、编址与地址的理解

作者头像
君辣堡
发布2025-12-20 08:58:11
发布2025-12-20 08:58:11
290
举报

今天,我来讲解一下指针,内存,地址

1.内存和地址

内存和地址其实很好理解,内存就像是一栋宿舍楼,而地址就是宿舍楼里的门牌号,⽣活中,每个房间有了门牌号,就能提⾼效率,能快速的找到房间。

这是生活中的例子,如果把上⾯的例⼦对照到计算机中,⼜是怎么样呢?

计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的

数据也会放回内存中,那我们买电脑的时候,电脑上内存是 8GB/16GB/32GB 等,那这些内存空

间如何⾼效的管理呢?

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

其中,每个内存单元,相当于⼀个学⽣宿舍,⼀ 个字节空间⾥⾯能放8个⽐特位,就好⽐同学们住

的⼋⼈间,每个⼈是⼀个⽐特位。

每个内存单元也都有⼀个编号(这个编号就相当 于宿舍房间的⻔牌号),有了这个内存单元的编

号,CPU就可以快速找到⼀个内存空间

⽣活中我们把⻔牌号也叫地址,在计算机中我们把内存单元的编号也称为地址。C语⾔中给地址

了新的名字叫:指针

所以我们可以理解为: 内存单元的编号 == 地址 == 指针


2.编址

CPU要访问内存中某个字节空间,那就需要知道这个字节空间在内存在位于哪里,同样的字节空间在内存中有很多个,所以就需要给内存进行编址;可以理解为:楼里有很多宿舍,需要给宿舍设置门牌号一样。

计算机中的编址,并不是把每个字节的地址记录下来,⽽是通过硬件设计完成的。

就像乐器一样,每个键发出什么声音,都是制造商在乐器硬件层面上就已经设计好了,并且所有的演奏者都知道。本质是⼀种约定出来的共识!

计算机内部有许多硬件单元,而硬件单元之间是需要互相协作的,也就是相互之间至少需要能够进行数据传递。

但是硬件与硬件之间是互相独⽴的,那么如何通信呢?答案很简单,⽤"线"连起来,所谓“线”,其实是指地址总线。硬件编址也是如此

我们可以简单理解,32位机器有32根地址总线,每根线只有两态,表⽰0,1【电脉冲有⽆】,那么

⼀根线,就能表⽰2种含义,2根线就能表⽰4种含义,依次类推。32根地址线,就能表⽰2^32种含

义,每⼀种含义都代表⼀个地址。

地址信息被下达给内存,在内存上,就可以找到该地址对应的数据,将数据在通过数据总线传⼊

CPU内寄存器。

如此一来,每个内存空间都有其对应的地址,CPU就能通过地址准确找到每个内存空间


3. 指针变量和地址,及其操作符(&,*)

3.1取地址操作符(&)

理解了内存和地址的关系,我们再回到C语⾔,在C语⾔中创建变量其实就是向内存申请空间,⽐如:

代码语言:javascript
复制
int main()
{
	int a = 10;
	return 0;
}

上述的代码就是创建了整型变量a,内存中申请4个字节,⽤于存放整数10,其中每个字节都有地址,可利用调试的内存功能查看地址,如下图:

这时我们可以得到a的地址:

代码语言:javascript
复制
0x006FFD70
0x006FFD71
0x006FFD72
0x006FFD73

a在内存中可能是这样存放的:

既然我们现在查看到了a的地址,那我们如何能得到a的地址呢?

              这⾥就得学习⼀个操作符--->    &   ( 取地址操作符)

如何应用?如下图:

代码语言:javascript
复制
int main()
{
	int a = 10;
	&a;//取出a的地址
	printf("%p\n", &a);
	return 0;
}

图中的输出结果会是:0x006FFD70

&a取出的是a所占4个字节中地址较⼩的字节的地址,即  0x006FFD70

整型变量占⽤4个字节,但我们只要知道了第⼀个字节地址,就可以顺腾摸瓜地访问到其他字节的地址;


3.2指针变量

那我们通过取地址操作符(&)拿到的地址是⼀个数值,⽐如: 0x006FFD70 ,这个数值有时候也需

存储起来,⽅便后期再使⽤的,那我们把这样的地址值存放在哪⾥呢?答案是:指针变量中

举例:

代码语言:javascript
复制
int main()
{
	int a = 10;
	int* pa = &a;//取出a的地址并存储到指针变量pa中
	return 0;
}

指针变量也是⼀种变量,这种变量就是⽤来存放地址的,存放在指针变量中的值都会理解为地址


3.3拆解指针类型
代码语言:javascript
复制
int a = 10;
int * pa = &a;

我们看到pa的类型是 int* ,我们该如何理解指针的类型呢?

这⾥pa左边写的是 int* , * 是在说明pa是指针变量,⽽前⾯的 int 是在说明pa指向的是整型(int)

类型的对象

那如果有⼀个char类型的变量ch,ch的地址,要放在什么类型的指针变量中呢

答案很简单,用char*类型的就行了,例如:char* =&ch;


3.4解引用操作符(*)

很简单,解引用操作符就是用来找到地址指向的对象的,比如:

代码语言:javascript
复制
#include <stdio.h>
int main()
{
int a = 100;
int* pa = &a;
*pa = 0;
return 0;
}

图中*pa=0就是用 * 这个解引用操作符找到pa所指向的地址中地址存储的东西,然后再把地址中的东西赋值为0,等效于 a=0;


3.5指针变量的大小

前面我们提到了地址总线,32位系统有32根地址总线,那我们把32根地址线产⽣的2进制序列当做⼀个地址,那么⼀个地址就是32个bit位,需要4个字节才能存储。

同理64位系统,有64根地址线,⼀个地址就是64个⼆进制位组成的⼆进制序列,存储起来就需要8个字节的空间,指针变量的⼤⼩就是8个字节。

结论:

•32位平台下地址是32个bit位,指针变量⼤⼩是4个字节

• 64位平台下地址是64个bit位,指针变量⼤⼩是8个字节

注意指针变量的⼤⼩和类型是⽆关的,只要指针类型的变量,在相同的平台下,⼤⼩都是相同的。

这节内容就先讲到这里,后面我还会继续讲解一些指针变量的内容,请各位多多支持,谢谢

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.内存和地址
  • 2.编址
  • 3. 指针变量和地址,及其操作符(&,*)
    • 3.1取地址操作符(&)
    • 3.2指针变量
    • 3.3拆解指针类型
    • 3.4解引用操作符(*)
    • 3.5指针变量的大小
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档