C语言如何操作内存

C语言对内存地址的封装(用变量名来访问内存,数据类型的含义,函数名的含义)

比如在C语言正   int a; a = 5; a += 4;     //    a = 9;

结合内存来解释C语言语句的本质: int a = 5; // 编译器帮我们申请了一个int类型的内存格子(长度是4字节,地址是确定的,但是只有编译器知道,我们是不知道的,也不需要知道),并且把符号a和这个格子绑定。  a = 5; //编译器发现我们要给a赋值,就会把这个值5丢到符号a绑定的那个内存格子中。

a += 4; //编译器发现我们要给a加值,a += 4 等效于 a = a + 4;编译器会先把a原来的值读出来,然后给这个值加4,再把加之后的和写入a里面去。

 C语言中数据类型的本质含义是:标示一个内存格子的长度和解析方法。

数据类型决定长度的含义:我们一个内存地址(0 x30000000),本来这个地址只代表一个字节长度,但是实际上我们可以通过给他一个类型(int),让他有了长度(4),这样这个代表内存地址的数字(0x30000000)就能标示从这个数字(0x300000000)开头的连续的n(4)个字节的内存格子了(0x30000000 + 0x30000001 + 0x30000002 + 0x30000003)。

数据类型决定解析方法的含义:比如我有一个内存地址(0 x30000000),我们就可以通过给这个地址不同的类型来指定这个内存单元格子中二进制数的解析方法。比如我:(int)0x30000000,含义就是(0x300000000)开头的连续的n(4)个字节的内存格子了(0x30000000 + 0x30000001 + 0x30000002 + 0x30000003)共同存储一个int类型数据。

C语言中,函数就是一段代码的封装。函数名的实质就是一段代码的首地址。所以说函数名的本质也是一个内存地址。

用指针来间接访问内存

关于类型(不管是普通变量类型 int float等,还是指针类型int*  float *等),只要记住:类型只是对后面数字或者符号(代表的是内存地址)所表征的内存的一种长度规定和解析方法规定而已

int a;       //int a; 时编译器会自动给a分配一个内存地址,比如0x12345678

(int *)a;   //等价于(int *)0x12345678

C语言中的指针,全名叫指针变量,int a和int *p没有任何区别,a和p都代表一个内存地址比如(0x2000000),但是这个内存地址的长度和解析方法不同,a是int型所以a的长度是4字节解析方法是按照int 规定来的,p是int*类型,所以长度是4字节,解析方法是按照int*的规定来的。

发布了14 篇原创文章 · 获赞 0 · 访问量 421

猜你喜欢

转载自blog.csdn.net/LIGUOZHENLX/article/details/104121721