c语言的内存分布
参考:
-
text段:代码段,由可执行指令构成
-
已初始化数据段:通常简单称作数据段,内部包括全局变量、静态变量
-
未初始化数据段:通常称作“bss”段,段内包含初始化为0的全局变量/静态变量以及源码中未显示进行初始化的变量。
-
栈:栈区域包含一个LIFO结构的程序栈,其通常放置在内存的高地址处
-
堆:堆通常用作动态内存分配,堆空间起始于BSS段的末尾
java中的内存分布
在java中,内存可以分为堆、栈、静态区、文字常量、代码;这里的内存就理解为运行内存。
-
堆:放函数参数、局部变量
-
栈:存储动态生成的对象,一般由程序员分配释放。
-
静态区或者全局区: 存储知全局变量道和静态变量。
-
文字常量区 :存储常量字符串。
-
代码区 : 存储函数体的2进制代码
-
变量其实只不过是程序可操作的存储区的名称。
-
变量名字需要满足标识符的规则,大写字母和小写字母是不同的(因为 C 是大小写敏感的)
常用的变量的取值大小
-
char:1个字节
-
short:2个字节
-
中文:3个字节
-
int:4个字节
-
float:4个字节
-
double:8个字节
定义变量
变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。
伪代码:数据类型 变量名字1,变量2,变量3
多个标识符之间用逗号分隔
extern int d = 3, f = 5; // d 和 f 的声明与初始化
int d = 3, f = 5; // 定义并初始化 d 和 f
byte z = 22; // 定义并初始化 z
char x = 'x'; // 变量 x 的值为 'x'
不带初始化的定义:带有静态存储持续时间的变量会被隐式初始化为 NULL(所有字节的值都是 0),其他所有变量的初始值是未定义的。
声明变量
-
变量声明向编译器保证变量以指定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。
-
变量声明只在编译时有它的意义
我警告你,我要打你咯,但是还没开始
声明可以多次,定义只能一次
extern:用来声明变量
可以声明变量不定义(赋值)需要用到关键字extern
extern int i; //声明,不是定义
int i; //声明,也是定义
声明变量的两种情况
-
一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
-
一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。
-
除非有extern关键字,否则都是变量的定义。
左值(Lvalues)和右值(Rvalues)
-
左值(lvalue):指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。
-
左值可以变成右值,但是右值不可以变成左值
-
右值(rvalue):术语右值(rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边
赋值号: =
简单的说,右值是真的值,在内存中存在的,左值是代号,随时可以被取代的。
变量是左值
数值型的字面值是右值
int g = 20;
-
g:左值
-
暂无评论内容