c 普通变量在内存中到底怎么回事

变量名 变量内容以及变量所在的地址到地怎么回事
2025-06-20 09:50:02
推荐回答(4个)
回答1:

变量是C语言中的一种基本语法对象。从语言本身角度看,变量名、从属的作用域(变量所在的源代码文件和函数,狭义的名字空间)唯一确定一个变量。
变量名在C语言中是一种标识符,用来从语义上区分不同的变量。
地址是表示内存空间位置的连续的非负整数值的集合。对于某一个具体的地址,它是一个非负整数,通常表示内存中的一个单元(大小一般是1字节)所在的位置。对内存中任意位置的内容进行操作,可以通过包含明确地址的机器指令来实现。连续有序的内存区域的内容可以称为“值”。
C语音中,能够在编译期被分配明确地址的语法对象称为左值。&操作符可以取左值的地址。变量在编译期会分配到一个地址,属于左值。例如定义char a;int b;,则&a表示char类型变量a的地址,&b表示int类型变量b的地址。由于sizeof(char)==1,即char变量占用1字节,所以&a也就是变量a在运行期实际会占用的地址,而a的值就是&a这个地址上的内存单元的内容。而sizeof(int)>1(通常的32位环境中是4),因此&b本身不表示b占用的地址空间,而仅仅是其中的1字节。b这个变量体现对象语义时,表示以&b为首地址的sizeof(int)个字节的一段连续有序的内存空间上的内容(至于哪个字节表示这个值的哪一部分内容,C语言中没有明确,取决于编译环境),也就是所谓的b的值。
C语言中的指针是一类值为表示地址的非负整数的变量(同时具有比一般整数变量更强的类型特征,例如某些以防止误用为目的的运算上的限制)。对应的常量称为地址常量。
----
详细过程说明:
----
编译期:编译器在编译源代码时,把变量名这种标识符和它的类型、占用空间大小、从属作用域等信息存放在符号表这种数据结构中,同时分配给变量唯一的地址(一个变量可能占用多个连续、有序的内存单元,此时地址是这片内存单元的首地址),用来区分不同的变量。编译器将源代码中的关于变量的操作转化为对变量的地址的操作,编译出目标指令,并输出至目标代码文件,再通过链接器链接输出可执行的程序文件。
运行期:可执行程序运行时,系统根据其自身的内容取出包含地址的指令,在内存中开辟指令中有关变量的地址对应的空间区域,以供程序中的其它指令(引用这个地址本身或者以这个地址为首地址的已知长度的变量的值)使用。
----
至于变量的值(内容),特指运行期对应地址的若干个(一个或多个)连续、有序的内存单元具有的内容。通过运行编译以后的可执行程序才能确定,因此编译器不会也无法干预(常量的值倒是可以写入目标代码)。
----
一般编译器处理生成的目标程序中没有变量名(函数名一般存在,供链接器用)。
====
[原创回答团]

回答2:

变量地址是在内存中随机分配的,你是管不到的
变量名就比如int x; x就是变量的名字,给你写程序使用的。
变量值:比如x = 4; 执行这句以后变量x的内容就是4了,当然你也可以在以后的程序修改它。

回答3:

具体细节我不太懂,不过可以这样理解

c语言中,申明一个变量的时候,例如int a = 1;
那么编译器就会为这个变量a开辟一定的内存空间用来存储a的值,开辟内存空间的大小根据变量类型而不同,例如int好像是四个byte的空间吧。这片存储a的内存空间或者说内存位置都会有一个指定的地址的,可以用&a 来获取这个地址。这个所谓的内存地址是一个16进制的数,它是系统对所有内存空间按字节标号所标示的某一个存储的位置。例如你的内存是16M,系统就会从0x0开始对16M字节的内存空间按字节编号,可以理解为每一个字节都分配一个标号作为所谓的地址,通过内存地址来找到你所存数据在内存中的位置,进而操作这个数据。

综上所述,变量名就是那个a,你可以通过变量名字来操作这个变量。
变量内容就是变量的具体的值。变量所在的地址在c语言中是指变量所处的内存地址,可以通过这个地址来代替变量名字操作这个变量。
以上的解释是不够精确的,因为实际中c编译器产生的所谓变量地址是否为真的windows管理的实际地址,我就不知道了,但是这样的解释能够帮助你理解这些概念。

回答4:

内存就是一溜房子。
门牌号码 0x0001 0x0002 0x0003 ...
定义变量int a = 4;
编译器会自动决定把这个变量放到哪个房子里。比如说0x0002
则:
变量名 :a
变量内容 :4
变量所在的地址 :0x0002