变量如何存储在计算机内存中?
例如:当我们指定
时int x = 15;
通常,计算机在其内存中分配4个字节的内存块,将值15以0和1的形式存储在分配的4个字节中,x表示分配的4个字节的内存地址。
现在,我的疑问是x如何指代内存位置。参考在何处以及如何存储?
当我们使用x时,如何知道该内存位置。
对于java和python等不同语言,这是否有所不同?
对于不同的数据类型,这是否不同?
如果您可以制作视频或博客来澄清这一点,我将感到高兴。
答案 0 :(得分:2)
通常,RAM中的计算机会分配4个字节...
整个句子是完全正确的。只是,有不同类型的分配。最简单的一个是计算机在一定时间内具有一定数量的空闲和连续内存。程序启动时,所有(空闲和连续)内存都分配给新程序。程序完全有责任管理内存,而不要在该内存区域之外进行写操作。这就是DOS(实模式)的工作方式-非常简单。仅通知程序(运行时)有关内存区域的开始和结束地址。它将一些“基”寄存器“映射”到该内存中,例如,地址0表示起始地址,程序可能知道变量X所在。更高级的操作系统超出了范围,例如具有阻止程序尝试在其允许的内存之外进行读取或写入的机制。甚至还可以,更复杂的OS最初可以给程序提供一些ram,然后在程序要求时提供更多的ram。
现在,我的疑问是x如何指代内存位置。参考在何处以及如何存储?
通常,引用根本不存储在(编译的)程序中。您(程序员)称为“ X”的原因是该程序只是一个地址。第一个变量地址0,第二个变量地址4,依此类推。 如果未删除调试符号,则跟踪地址中指定的“高级”名称;但它们由调试器使用,从技术上讲,它们不是“程序”的一部分。
当我们使用x时,如何知道该内存位置。
让我们编写一个简单的C程序:
int x = 15;
int y = 20;
int s;
s = x+y;
编译器看到“ int x”并将地址0分配给x。然后看到“ int y”并为其分配地址4。然后将地址8分配给“ s”。当然,这些地址会在整个编译过程中被记住。 同时看到“ x = 15”和“ y = 20”,并输出以下指令:
"store an integer of 4 bytes, value 15, at address 0"
"store an integer ..., 20, at address 4"
最后,它看到“ s = x + y”并输出:
"take in the left hand the int (4 bytes) value at address 0"
"take in the right hand the int value at address 4"
"poor the left hand in the right hand"
"poor the right hand in 4 bytes at address 8"
如您所见,没有更多的y或s,只有地址(这是一个非常简化的解释)。
对于java和python这样的不同语言,这有区别吗?
是,但不过分。变量的名称始终引用地址。纯解释语言必须跟踪名称,因为在编译和执行之间没有分隔,而像Java这样的中间语言(我之所以说中间语言是因为Java既是编译器又是解释器)可以完成更复杂的事情。
对于不同的数据类型,这有区别吗?
对于简单类型,不。在C语言中,如果我们不考虑指针和堆,则所有变量都被视为相同,只是它们的长度发生变化。一个int可以是4个字节长,一个char可能是一个字节,一个数组具有程序员指定的长度,但是变量始终引用包含该值的缓冲区的第一个位置。编译器会为每个变量保留其地址,类型,长度,因此在源中遇到变量名称时,它可以知道要做什么(要编译的指令)。
这在概念上非常简单。编译器读取源文本。每次遇到变量声明时,都会为其分配第一个空闲地址,然后将其递增变量的大小。首先,该地址为0。在编译器读取“ int x;”之后,x的地址变为0,“当前”地址递增(对于int,可能为4或8)。变量名称,类型和地址将保留,并形成查找表。该表用于检查您是否没有两次声明标识符,并且用于在源引用已声明的变量时知道在哪里读写。如果源引用未声明的变量,则编译器会抱怨,因为它没有在查找表中找到该变量。撇开笔记:您发布了指向指针的视频的链接;指针也是变量,但是它们引入了其他概念。我所说的地址也适用于指针,从某种意义上说,它们只是变量,但其值的使用方式有所不同-我不明白为什么您坚持使用指针。