我一次又一次地看到内存位置的表示,它被描述为矩形框的线性阵列,其各自的内存地址位于左侧。现在,这些地址一般写成2000、2004、2008...等。(我想对于 32 位机器)。
根据所述系统,内存位置只是普通整数。但是当我在 C/C++ 中打印出地址时,它们会显示为字母数字字符串。另外,如果它们实际上只是整数,那会不会有问题,因为包含像 2000 这样的数值的寄存器(比如 R1)可以突然充当指向内存位置的指针,只需将其括在括号中?像这样: (R1) - >this 将指向内存位置 2000
(顺便说一句,那是汇编语言)
那么内存地址究竟是如何存储在内存中的呢?
可能是因为您
%X
在格式字符串中使用了类似的东西,将其呈现为十六进制数。使用%d
将以十进制打印地址。真的。在 C 语言中,没有什么能阻止你这种误用。管理这个是程序员的责任。
在现代系统中,内存地址通常是“虚拟的”,主要由专门用于此任务的硬件组件 MMU(内存管理单元)管理。
是的,因为它们只是数字。
您没有提到这些地址显示在什么基数(或数字基数)中。
如果地址以基数 2 表示,那么将只有 0 和 1。
过去八进制表示很常见,因此地址可以用数字 0 到 7表示。
如果地址以 16 为基数表示,那么十六进制数字包括 0 到 9 以及字母 A 到 F。这是您指的是“字母数字字符串” ?
错误地编写指令或语句(又称错误)始终是编程中的一个问题。
但是内存地址就像整数一样。
这就是完成表/结构位移的指针算术和计算的方式。
高级编程语言(如 C)将具有不同的变量类型来区分 a
pointer
和 anunsigned int
orunsigned long
,但是当数据类型具有相同的存储大小时,二进制结构没有实际差异。使用和转换的限制只是为了实现编程顺序并避免潜在的错误。在 CPU 级别,任何
pointer
(或内存地址)都可以被视为一个整数,任何整数都可以被视为一个内存地址。它们都只是数字。底线:CPU 只知道如何处理数字。一切都必须转换为(二进制)数字,以便计算机处理此类“信息”。
一个“内存地址”,也就是指针,被存储为一个数值,就像一个整数(具有适当的大小)一样。
您认为内存地址不是数字/整数的前提是不正确的。
内存地址可以是绝对的,也可以是相对于基地址的偏移量。
程序中的内存地址以十六进制格式,由变量名或标签等表示。在汇编中,地址可以存储在寄存器中,因此可以称为寄存器的内容,例如,(R1)是地址存储在寄存器 1 中。检查一下:https ://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture#Segment_Registers 。
在特定体系结构中,区分物理地址和虚拟内存地址、分页的概念以及操作系统如何调用内存管理工作非常重要。
还需要了解内存分段的概念,以及不同的段类型、共享内存的概念、动态与静态链接库等。
根据架构,内存位置(我们称之为指针)的长度和数据类型会有所不同。
最后,存在实际内存空间大于总线地址方向所能寻址的情况,需要对内存“bank”进行切换,这就是引入远指针概念的原因。查看近指针和远指针之间的区别。
所以简而言之,这个问题太开放了,因为它被制定了。