C语言对内存地址的封装
在C语言中,我们是通过变量名或函数名来进行对其内存操作,而不是直接使用地址。
比如,定义int a ; a=1; a += 2;
结合内存来解析其本质,分析:
int a;
//编译器帮我们申请了1个int类型的内存格子(长度是4字节,地址是确定的,但是只有编译器知道,我们是不知道的,也不需要知道。),并且把符号a和这个格子绑定。
a = 1;
// 编译器发现我们要给a赋值,就会把这个值1丢到符号a绑定的那个内存格子中。
a += 2;
// 编译器发现我们要给a加值,a += 2 等效于 a = a + 2;编译器会先把a原来的值读出来,然后给这个值加2,再把加之后的和写入a绑定的内存中。
可以总结: C语言中数据类型的本质含义:表示一个内存格子大小和解析方法
解析数据类型的本质含义
- 数据类型决定内存占用格子大小:可以理解,比如我们一个内存地址(0x30000000),本来这个地址只代表1个字节的长度,但是实际上我们可以通过给他一个类型(int),让他有了长度(4),这样这个代表内存地址的数字(0x30000000)就能表示从这个数字(0x30000000)开头的连续的n(4)个字节的内存格子了(0x30000000 + 0x30000001 + 0x30000002 + 0x30000003)。char和short类型同理分析,可见下图
- 数据类型决定解析方法:譬如我有一个内存地址(0x30000000),我们可以通过给这个内存地址不同的类型来指定这个内存单元格子中二进制数的解析方法。譬如我 (int)0x30000000,含义就是(0x30000000 + 0x30000001 + 0x30000002 + 0x30000003)这4个字节连起来共同存储的是一个int型数据;那么我(short)0x30000000,含义就是(0x30000000 + 0x30000001)这2个字节连起来共同存储的是一个short型数据;这本质是上一个的逆向解析。
这里再次强调很重要的概念:内存单元格子的编址单位是字节。这个是我们理解内存非常重要的基础!