CodeGym /课程 /C# SELF /内存寻址和变量

内存寻址和变量

C# SELF
第 2 级, 课程 4
可用

1. 内存结构

每台电脑都有内存。那它到底是啥,有什么特性,最重要的是,对我们有啥用?

每个程序(包括用C#写的程序)在运行前都会被加载到内存里。内存里存着程序的代码(CPU要执行的那部分)和程序的数据(程序自己往内存里塞的数据)。

那内存到底是啥,长啥样?

想象一下Excel 😎 Excel表格就是由一堆单元格组成的,每个单元格都有唯一编号(A1、A2、... B1、B2)。只要知道单元格的编号,就能往里写点啥,或者拿出里面的值。电脑的内存其实也差不多。

memory-excel

程序和它的数据在运行时都存在内存里。整个电脑的内存其实就是一堆小格子——字节。每个格子都有自己的唯一编号——0、1、2、3、...;(编号从0开始)。只要知道格子的编号,我们就能把数据塞进去,或者取出来。有的格子里放着程序代码——就是给CPU的指令,有的格子里放着程序的数据。格子的编号也叫地址。

CPU能执行加载到内存里的程序指令。几乎所有的CPU指令都是:从某些格子里拿数据 → 对它们做点啥 → 把结果放到别的格子里。

把几百个简单指令组合起来,就能搞出很复杂很有用的操作。

当你在代码里声明一个变量时,系统会给它分配一块还没用过的内存。一般来说就是几个字节。声明变量的时候必须指定要存啥类型的数据:数字、文本还是别的。因为如果不知道类型,系统就不知道要给变量分多大的内存块。

早期的计算机程序都是直接用内存格子的编号来操作的,后来为了让程序员更爽,大家给格子起了名字。变量的唯一名字其实主要是为了程序员方便:程序本身其实用编号也能跑得飞快。

2. 变量在内存中的表现

在C#里有4种主要的整数类型:byte、short、int和long。

类型 大小,字节 名字的由来
byte 1 Byte,因为它只占一个字节
short 2 Short Integer的缩写
int 4 Integer的缩写
long 8 Long Integer的缩写

另外在C#里还有2种浮点类型——float和double:

类型 大小,字节 名字的由来
float 4 Floating Point Number的缩写
double 8 Double Float的缩写

每次程序执行到创建变量的语句时,系统就会给它分配一小块内存(大小取决于变量类型)。

int a = 10;
声明一个 a类型为 int的变量,并为它分配内存
注意!

变量的地址就是分配给它的内存块的第一个格子的地址。

C#程序不允许直接操作内存。所有内存相关的操作都被C#和.NET严格管控。

3. string类型在内存中的表现

string类型可以存很多数据,所以它不仅仅是个数据类型,更像是个完整的对象。

string类型的数据(文本)会被放到一个专门的对象里,这个对象会被分配一块内存,然后这个对象的地址会被放到变量里,变量本身也会分配内存。

  • 变量a类型为int,占4字节,存的值是1。
  • 变量b类型为int,占4字节,存的值是10,555。逗号不是小数点,只是分隔位数。小数部分用点分隔。
  • 变量d类型为double,占8字节,存的值是13.001。
  • 变量str类型为string,占4字节,存的值是D12——也就是存放文本的对象的第一个格子的地址。

string类型的对象(存着文本)会单独分配一块内存。它的第一个格子的地址会被存到str变量里。

4. 赋值时发生了什么

还有个很重要的点——赋值到底是怎么工作的。比如:

int a = 10;
int b = a;
b = 20;
Console.WriteLine(a); // 10

这个例子里,内存里会有两个格子:一个给a,一个给b。当你写b = a;时,复制的是值(10),不是“箱子”本身。改了b,对a没影响。

现在来看看字符串的情况:

string s1 = "Hello";
string s2 = s1;
s2 = s2 + " World";
Console.WriteLine(s1); // "Hello"
Console.WriteLine(s2); // "Hello World"

这里s1和s2两个变量都指向同一个字符串"Hello",直到你修改它。当你执行s2 = s2 + " World"时,s2会变成一个新的字符串"Hello World",而s1还是原来的"Hello"。

5. 为啥编程里都从0开始数

很多人都奇怪,为什么编程里几乎都是从0开始数。其实有很多场景,从0开始数更方便(当然也有时候从1开始更顺手)。

最简单的例子就是内存寻址。如果你的变量被分配了4字节内存,你有个X——第一个字节的地址,那这4个字节的地址分别是多少?X+0、X+1、X+2、X+3。这不就是一组下标0、1、2、3嘛。

当我们考虑某个数据块里的相对地址时,编号总是从0开始。这就是最常见的从0开始数的原因。

2
任务
C# SELF, 第 2 级, 课程 4
已锁定
帝皇保佑
帝皇保佑
2
任务
C# SELF, 第 2 级, 课程 4
已锁定
人类将会胜利
人类将会胜利
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION