数据结构基础
前言
数据结构主要要解决的问题是:
- 数据如何在内存中存储,以什么结构存储。
- 对应不同的存储结构应该用什么样的方法对数据进行操作来满足相应的需求。
简单来说,上面第一点就是数据结构,第二点就是算法。不同的数据结构必然会有不同的算法来对数据进行操作。
学习需要的基础
- 任意一种编程语言基础。(比如C语言
- 熟悉理解内存的结构并能精确控制。(比如利用C的指针正确控制内存
- 面向对象的编程思想。
基础测试
阅读下面的代码,回答后面的问题,如果你都能和答案理解意思一样,说明:
- 你C语言基础已经可以学习数据结构并且不会有什么大问题。
- 你对内存结构有了深刻的理解。
- 你有了基本的面向对象思想,以及明白了面向对象在底层的部分实质。
代码如下:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#include <stdio.h> #include <stdlib.h> struct student{ int id; //学号 int c; //C成绩 int math; //高数成绩 }; typedef struct student* Student; Student newStudent(int id, int c, int math); void show(Student this); int main(){ Student stu1 = newStudent(2015011777, 90, 100); show(stu1); return 0; } Student newStudent(int id, int c, int math){ Student ret = NULL; ret = (Student)malloc(sizeof(struct student)); ret->id = id; ret->c = c; ret->math = math; return ret; } void show(Student this){ printf("id:%d\n", this->id); printf("c:%d\n", this->c); printf("math:%d\n\n", this->math); } |
问题:
- 第9行的目的是什么?
- newStudent的意义是什么,它的返回值类型为什么是Student?
- Student的本质是什么?
- 21行写成Student stu1;同时删掉22行行不行?
- 23行、28行为什么要用->,能不能用.(这是一个点)
答案解析将在之后更新。。。如果你无法回答,可以阅读思维导图指针教程部分的内容
答案
- 第9行的目的是把一组数据集合的指针定义为一种新的类型。
- newStudent的意义是创建新的学生,返回值是指向学生的指针。
- Student的本质是结构体的指针。
- 不行,仅有指针并没有申请内存,数据实际还不存在。
- 因为是结构体的指针,而不是结构体本身,所以用->访问。
内存分析
第15行
调用newStudent函数,传入参数。
申请1块内存stu1,把函数返回值赋值给stu1。
第20行:函数调用内部
申请一个结构体指针ret初始化为空。
用malloc动态申请一个结构体大小的内存,并把首地址赋给ret。
利用传入的参数初始化结构体的内容。
把ret里面的内容返回,ret在函数结束后被自动回收。
回到16行
把stu1的内容传入show函数。
第27行:函数调用内部
根据传入的stu访问里面的数据。
回到17行程序结束。
内存图解
15行函数调用前
函数调用过程,21行开始执行
21行执行完毕,开始执行22行
22行执行完毕,开始执行23行
23行执行完毕,返回15行,传回ret
开始执行16行
28-30行开始执行,根据this指针访问内存。函数结束,回收show函数空间。
总结
看到this是不是很熟悉??面向对象其实就是对一个数据集做一些操作,这些数据就叫属性,这些操作就叫方法。改改语法是不是和Java或者C++很相似??这些既是面向对象的底层部分细节,也是学习数据结构必要的知识,只有对内存了如指掌才有可能灵活的控制使用内存。
1 Comments
围观一波