变量如何存储在计算机内存中?
例如:当我们指定时
int x=15;
通常,计算机在其ram中分配一个4字节的内存块,在分配的4个字节中以0和1的形式存储值15,x指的是分配的4字节内存的地址。
现在,我怀疑x是如何指向内存位置的。参考资料存储在何处以及如何存储?
当我们使用x时,它知道如何引用那个内存位置。
对于像java和python这样的不同语言,这是不同的吗?
对于不同的数据类型,这是否不同?
如果你能制作视频或博客来澄清这一点,我会很高兴。
通常,计算机在其ram中分配4个字节。。。
整句话完全正确。只是,有不同类型的分配。最简单的是,计算机在某个时刻拥有一定数量的空闲和连续内存。当一个程序启动时,所有的(空闲和连续的)内存都会给新程序。程序完全有责任管理内存,而不是在内存区域之外进行写入。这就是DOS(真实模式)的工作方式——非常简单。程序(好吧,它的运行时)只被告知内存区域的起始地址和结束地址。它";地图";一些";基本";寄存器到该ram中,例如,地址0指的是起始地址,程序可能知道变量X所在的地址。更先进的操作系统超越了这一点,例如,它具有阻止程序在其允许的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到"0";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"
"pour the left hand in the right hand"
"pour the right hand in 4 bytes at address 8"
正如您所看到的,没有更多的xy或s,只有地址(这是一个非常简单的解释)。
对于不同的语言(如java和python),这是不同的吗?
是的,但不要太多。变量的名称总是指一个地址。纯解释语言必须跟踪名称,因为编译和执行之间没有分离,而像java这样的中间语言(我说中间语言是因为java既是编译器又是解释器)可以做更复杂的事情。
对于不同的数据类型,这是不同的吗?
对于简单类型,没有。在C语言中,如果我们不考虑指针和堆,所有变量都会被相同对待,只是它们的长度会改变。int可以是4字节长,char可以是1字节长,数组的长度由程序员指定,但变量总是指包含该值的缓冲区的第一个位置。编译器为每个变量保留其地址、类型和长度,以便在遇到源中的变量名称时知道该做什么(编译什么指令)。
编辑";你能告诉我";x变为0〃;部分发生在编译期间的计算机中">
它的概念非常简单。编译器读取源的文本。每次遇到变量声明时,它都会为其分配第一个可用地址,然后按变量的大小递增。一开始,此地址为0。在编译器读取一个";int x&";,x的地址变为0;当前";地址递增(对于int,可能是4或8)。变量名称、类型和地址都会保留下来,并形成查找表。该表用于检查是否没有两次声明标识符,并用于在源引用已声明的变量时知道在哪里读写。如果源引用了未声明的变量,编译器会抱怨,因为它在查找表中找不到该变量。顺便说一句:你发布了一个关于指针的视频链接;指针也是变量,但它们引入了其他概念。我所说的地址也适用于指针,从某种意义上说,它们只是变量,但它们的值使用不同——我不明白你为什么坚持使用它们。