牛股网

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1256|回复: 4

关于内存地址和内存空间的理解

[复制链接]

1052

主题

1266

帖子

4613

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4613
发表于 2023-5-29 17:27:40 | 显示全部楼层 |阅读模式
https://www.cnblogs.com/VIPler/p/4282584.html

1.内存地址用4位16进制和8位16进制表示的区别。例如经常可以看到某些书籍上写的内存地址0x0001,在另外一些书籍上写的内存地址又变成了0x00000001。都是表示的编号为1的内存地址,为什么一个是4位16进制表示,另外一个又是用8位16进制表示呢?

首先,必须要知道内存地址只是一个编号,代表一个内存空间。那么这个空间是多大呢?原来在计算机中存储器的容量是以字节为基本单位的。也就是说一个内存地址代表一个字节(8bit)的存储空间。

例如经常说32位的操作系统最多支持4GB的内存空间,也就是说CPU只能寻址2的32次方(4GB),注意这里的4GB是以Byte为单位的,不是bit。也就是说有4G=4*1024M(Byte)=4*1024*1024Kb(Byte)=4*1024*1024*1024bit(Byte),即2的32次方个8bit单位。

所以说用4位16进制表示的内存地址和用8位16进制表示的内存地址,其实都是代表一个8bit的存储空间而已:

image

image

至于说为什么会出现一种是用4位十六进制表示内存地址,另一种用8位十六进制表示内存地址,那是根据不同的硬件环境来的。个人理解:有些CPU只能寻址16位(16根地址线),所以用4位十六进制表示地址就够用了。有些CPU只能寻址32位(32根地址线),所以用8位十六进制。

另外记住, 210 = 1024

             1G  = 1024 M

             1M  =  1024 Kb

             1Kb = 1024 bit

2.理解内存。

程序和数据平常存储在硬盘等存储器上,不管你开机或关机了,它们都是存在的,不会丢失。硬盘可以存储的东西很多,但其传输数据的速度较慢。所以需要运行程序或打开数据时,这些数据必须从硬盘等存储器上先传到另一种容量小但速度快得多的存储器,之后才送入CPU进行执行处理。这中间的存储器就是内存。

无论何种存储器,软盘、硬盘、光盘或者内存,都有地址。因为它们要存储数据,所以就必须按一定的单位的数据分配一个地址。有了地址,程序才能找到这些数据。这很好理解,想想你们家为什么要有门牌号即可。

学习编程,必须对内存的地址有一个透彻的理解。我们编程中的每一行代码,代码中用到的每个数据,都需要在内存上有其映射地址。当然,我们并不需要掌握内存是如何进行编址,那是计算机系中的另外一门课:操作系统的事了。

内存地址:
计算机把所有的信息都给数字化了,所以它知道自已把一个数据,一条命令记到了内存中的哪个(些)位置。
看下面的例子:
如果让计算机在内存里记住“丁小明”这个名字,可以示意为:

image

在第一行中,每一格表示一段内存,而格子里的内容是这段内容记下的数据;第二行中每一格内数字就是对应的内存的地址。
可能有人会啄磨:为什么一个“丁”字(“小”“明”两字也一样)占用两个内存地址呢?这是因为汉字在一个地址(位置)里呆不下,必须放在连续的两个地址空间内。那么,什么东西可以放在单独的一个内存地址里呢?像英文的里字母,比如’A’, 像阿拉伯数字:比如’1’,可以,而且就是放在一个内存地址里。假设有一字符串“ABC”,被记在内存里,可示意为(这次我们假设从内存地址2000H处记起):

image

现在我们提几个问题:

计算机记住”丁”字的内存地址是多少? 答案是:1000H。请见上图

我们一直在说,在计算机中,所有信息都被数字化为2进制的0、1,所以,“丁小明”这个名字被也应该是一串:0001 0010 0111 0101……,可是在中图所画出的,计算机内存里记的,仍是“丁小明”三个字啊。

下面是解释,我们只举一个字”丁”讲解。我们假设在那一串里的 0001 0010 0111 0101 对应的是 “丁” 字,那么有:

image

让我们把字母’A’对应的图也画出来:

image

在上面的两个图中:

第一行分别是“丁”和“A”,它是给人看的。

第二行则是一串的的0和1,这才是计算机内存中实际存储的数据。

第三行是内存的地址。并不是每个0和1所占的位置都被编上地址。而是每8个才拥有一个地址。

关于第三行,你可以这样理解,门牌号是一个家庭分配一个,每家每户内还有客厅卧室,这些就没有地址了。

可见:

‘丁’的确是由一串0、1组成的。更确切地,从图上可以看出‘丁’是由16位0和1组成。这16数都存放在2个内存地址里。

‘A’也一样,它是由8位0、1组成的。占1个内存地址。

总结:内存地址是内存当中存储数据的一个标识,并不是数据本身,通过内存地址可以找到内存当中存储的数据。
回复

使用道具 举报

1052

主题

1266

帖子

4613

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4613
 楼主| 发表于 2023-5-29 17:28:30 | 显示全部楼层
内存地址的概念与理解
https://blog.csdn.net/m0_6676926 ... 68645-null-null.142^v88^control_2,239^v2^insert_chatgpt&utm_term=%E5%86%85%E5%AD%98%E5%9C%B0%E5%9D%80&spm=1018.2226.3001.4187
回复

使用道具 举报

1052

主题

1266

帖子

4613

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4613
 楼主| 发表于 2023-5-29 17:28:49 | 显示全部楼层
一步成高手:终极图解内存(上篇)
https://blog.csdn.net/gumingyaotangwei/article/details/23951799
回复

使用道具 举报

1052

主题

1266

帖子

4613

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4613
 楼主| 发表于 2023-5-29 17:31:34 | 显示全部楼层
新手必看:C/C++指针及内存!!
https://zhuanlan.zhihu.com/p/421822336
回复

使用道具 举报

1052

主题

1266

帖子

4613

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4613
 楼主| 发表于 2023-5-30 11:16:50 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|转载文章说明|niugoo.com ( 京ICP备19006189号 )

GMT+8, 2024-12-22 11:11 , Processed in 0.062501 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表