天天看点

内存管理艺术3(基于C语言)

内存管理艺术3(基于C语言)

                                            ---------C语言如何操作内存?

数据类型----长度和解析方法

基于朱有鹏C语言高级视频总结

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

寄存器其实就是内存,

结合内存来解析C语言语句的本质:

Int a;    //编译器帮我们申请了1个int类型的内存格子(长度是4字节地址只有编译器知道,我们肯定是不知道的)并且把符号a和这个格子绑定。

变量名和内存地址一一定义了;

C语言中数据类型的作用:

表示一个内存格子的长度和解析方法:

很多同学不理解强制类型装换:

本质上是没有改变的:

(Int* )0    代表的是一个内存的地址0

我们认为这个是一个0地址的指针,只不过这里面存放的是一个整形的数。

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

之前讲过一个很重要的过概念,内存单元的格子的遍址的单元是字节。

数据类型还能够解析方法:

比如我有一个内存地址(0x30000000),我们可以通过给这个内存地址不同的类型来指定这个内存单元格子中的二进制数的解析方法,比如我给他一个int型

(int)0x3000000  和(float) 0x30000000 这里面解析方法是不一样的。

函数名:

函数在C语言里面,函数就是一段代码的封装,函数名的实质,就是这一段代码的首地址。

2、用指针来间接的访问内存

在C语言可以用间接访问内存,也涉及到我们掌握的数据类型,

关于类型:

不管是普通的变量类型int float等,还是指针类型int* float*

只要记住:

(1)类型只是对后面的数字或者符号(代表的都是内存的地址)所表征的内存的一种长度规定和解析方法。

 (Int*) 0;

(int *)a;     a和0其实是没有本质的区别的,就是a会由编译器随机的分配一个地址。

(2)C语言中的指针,全名叫做指针变量,指针变量其实和普通变量没有任何的区别,比如int a  和int *p 其实是没有任何的区别的,a和p都代表一个内存地址,但是这个内存地址的解析方法不一样,但是这个内存地址(0x20000000)的长度和解析方法不同,a是int型所以a的长度是4字节,p是int* 类型,解析方法是按int *的规定来的(0x20000000开头的连续4个字节中存储了1个地址,这个地址所代表的内存单元中存放的是一个int类型的数)。

3、用数组来管理内存

数组管理内存其实和变量没有本质区别,只是符号的解析方法不同。(普通变量、数组、指针变量)差别就是他们的符号的解析方法不一样,都是对内存地址的解析,有长度都是要涉及到长度和变量。

有些内存有一个互相呼应的过程。

4、内存管理之结构体:

数据结构这门学问的意义;

数据结构就是研究数据在内存中如何排布?

如何加工,数据就得放在内存当中,如何加工的学问。

最简单的数据结构是数组:

因为程序中有好多个类型相同、意义相关的变量需要管理,这时候如果用单独的变量来做程序看起来比较乱,用数组来管理会更好的管理。

比如说定义一个int ages[20];  我要管理一个班的20个学生的年龄。

数组的优势和缺陷:

优势:数组比较简单,访问用下标,可以随机访问。

缺陷:1、数组中所有元素的类型必须相同。

      2、数组的大小必须在定义时给出,而且一旦确定不能再改。

数组是不具有伸缩性。

      这个程序给出的灵活性就比较差了。

结构体的隆重登场:

       1、结构体发明出来,就是为了解决第一个缺陷的。

我们要管理三个学生的年龄,

第一种解法:我要用数组, int ages[3];

第二种解法:我用结构体:

Struct ages

{

Int age1;

Int age2;

Int age3;

};

Struct ages age;

分析总结:在这个示例中数组要比结构体好。在元素类型不同的时候就只能使用结构体了,不能使用数组了。

整个一个结构体里面的成员变量的长度是不一样的,所以说结构体里面,只能用.的方式来访问到每一个元素的地址。

怎么在内存里面寻址?

题外话:结构体内嵌指针实现面向对象:

  面向过程和面向对象,

总的来说:C语言是面向过程的,但是C语言写出的linux系统是面向对象的。

非面向对象的语言,不一定不能实现面向对象的代码,只是说用面向对象的语言来实现面向对象更加简单,直观一些,无脑一些。

用C++和JAVA等面向对象的语言实现面向对象简单一些,因为语言本身帮我们做了很多事情,但是用C来实现面向对象很麻烦,看起来也不容易理解。

有一个类,有一个成员变量和方法。

这样包含了函数指针的结构体就相当于面向对象中的class,结构体中的变量类似于class中的成员变量,结构体中的函数指针类似于class中的成员方法。

继续阅读