1.5.1 数据结构这门学问的意义
数据结构就是研究数据如何组织(在内存中排布),如何加工的学问。
1.5.2 最简单的数据结构:数组
为什么要有数组?因为程序中有好多个类型相同、意义相关的变量需要管理,这时候如果用单独的变量来做程序看起来比较乱,用数组来管理会更好管理。譬如:int ages[20];
1.5.3数组的优势和缺陷
优势:数组比较简单,访问用下标,可以随机访问;
缺陷:1、数组中所有元素类型必须相同;2、数组大小必须定义时给出,而且一旦确定不能再改,灵活性太差了。
1.5.4结构体隆重登场
结构体发明出来就是为了解决数组的第一个缺陷:数组中所有元素类型必须相同;
如:我们要管理3个学生的年龄(int类型),怎么办?
第一种解法:用数组 int ages[3];
第二种解法:用结构体
struct ages
{
int age1;
int age2;
int age3;
};
struct ages age;
分析总结:在这个示例中,数组要比结构体好。但是不能得出结论说数组就比结构体好,在包中元素类型不同时就只能用结构体而不能用数组了。
struct people
{
int age;
char name[20];
int height;
};
因为people的各个元素类型不完全相同,所以必须用结构体,没法用数组。
所以从内存的角度我们完全能够理解数组和结构体,数组在内存中是连续的一段,它的每个元素所占的空间是一样大的,数组名就是首元素的首地址,所以可以通过首元素地址继而推断出后面任意一个元素的地址;而结构体也是内存中连续的一段,但是它的每个元素所占的空间是不一样大的,有的可能是char类型,int类型,float类型等,结构体的变量名也是这段内存空间的首地址,在结构体中每个元素的名字就表示在该结构体中该变量的首地址;
1.5.5题外话:结构体内嵌指针实现面向对象
面向对象与面向过程:
总的来说,C语言是面向过程的,但是C语言写出的Linux系统是面向对象的;
非面向对象的语言,不一定不能实现面向对象的代码。只是说面向对象的语言来实现面向对象要更加简单一些、直观一些、无脑一些。
用C++、Java等面向对象的语言来实现面向对象简单一些,因为语言本身帮我们做了很多事情;但是用C来实现面向对象很麻烦,看起来也不容易理解,这就是为什么大多数人学过C语言却看不懂Linux内核代码的原因;
面向对象就是有一个类,在这个类中有成员变量和成员方法(函数)。但是在结构体中本来是只能放变量的,而不能将函数写入结构体中;但是我可以放函数指针,函数指针是一个变量,我用函数指针这个变量去指向一个函数就相当于我这个结构体中有了函数,那么我这个结构体中就既有了变量又有了方法,那么此时结构体就变成了一个类了。
struct s
{
int age; //普通变量
void (*pFunc)(void); //函数指针,指向void func(void)这类的函数
};
使用这样的结构体就可以实现面向对象。
这样包含了函数指针的结构体就类似于面向对象中的class,结构体中的变量类似于class中的成员变量,结构体中的函数指针类似于class中的成员方法。