老衲累了!但是老衲还是想问问数据是什么?那么又跟数据结构是什么关系呢?
咳咳!老衲也不给咱买瓶饮料,谁让喜欢呢!!!!
关于这块我想要结合这linux操作系统来好好絮叨这块,主要是linux确实有一些命令可以很方便的使用。
一、数据是什么?
先拽一段数据概念:
数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的的原始素材。数据是信息的表现形式和载体,可以是符号、文字、数字、语音、图像、视频等
不知道老衲理解了没,反正我看的有点眉头紧凑!
数据:换种说法,可以是现实生活中的一些事物,比如电脑,饮料,以及电视剧等数字的表现形式。
数据要在程序中使用,那当然就得有载体不是,那么载体是什么呢?
问题1:我想问老衲了,那程序中的变量是指什么?
老衲迷茫了,一脸懵,我哪知道。
那就听听我的理解:变量其实是数据的容器。变量中所存储的数据是可以改变的。变量的实质是连续分配的一块特定大小的内存空间。
那么老衲,数据结构你知道是什么意思了吗?
老衲说:我猜啊!难道是存放数据的一种结构吗! 真聪明
数据结构某种意义上来说也是存放数据的一种容器。就像数组一样,把若干个数据沿直线排列起来的数据结构。(相比较,数据结构也有一些比如,链表,栈,队列,树,堆等)。
问题2:那么老衲又在问了,不对呀,我写代码的时候有这么道题叫反转链表,老师都说这是链表呀?
其实我在引言里面就说了这些意思,数据结构跟算法他俩是分不开的。那我们来说说程序是啥吧。
程序是用来在计算机上实现现实世界中的业务和娱乐活动的,为了达到这个目的,曾许愿需要结合计算机的特性,用程序来表示现实世界中对问题的处理步骤,即处理流程。
那么算法(处理问题的步骤)和数据结构(作为处理对象的数据排列方式)。
就像链表啊:
struct ListNode{ int data; struct ListNode* next; };
这个结构体就是什么呢,他就是一个容器,用来存放一个链表的节点。
这块我想给大家介绍候捷老师的一本书叫STL源码剖析。
里面呢分为了三大块:
- 容器(如字符串,vector(线性数组),list(双向链表),queue(队列),哈希表等等
- 算法(如查找、排序、插入、删除等操作)
- 迭代器,有兴趣可以看看,迭代器呢其实是把容器和算法柔和到一起,加快了开发项目的效率
好了!回到整体!
老衲说,那么这些数据在内存中是如何分布的呢?
二、数据,换言之程序的内存分布!
程序与内存的关系。好比鱼和水一般密不可分,内存是承载程序运行的介质,也是程序进行各种运算的表达场所。
我们上一篇博客提出了如何让程序(可执行文件)映射到计算机内存里面,然后让cpu通过调用来进行执行程序呢?(这块涉及到了cpu如何从内存中读取数据,以及分段和分页的由来,后面讲)
现在我大概的说一下,假如老衲写了一个hello.c文件,运行起来就是一个进程(后面会讲进程是什么)如下:
#include <stdio.h>
#include <stdlib.h>
struct List{
int data;
struct List* next;
}ListNode;
int main()
{
//创建一个数组
char a[10] ={0};
//创建一个链表
ListNode* P=NULL;
p =(ListNode*)malloc(sizeof(ListNode));
free p;
return 0;
}
分别创建了两个数据结构,一个是大小为10字节的数组,另一个是链表。如果想要深入理解的话,进程结构和内存布局,看看这个(后面会更新面经经验关于程序和进程之间的关系)
这块我们就不过多阐述这个问题了!
计算机所处理的数据都存储在被称为内存的IC(IC又叫集成电路)。通俗来讲讲吧!
在一般的个人计算机中,内存内部被分割成了若干个数据存储单元,每个单元可以存储8比特位的数据(8比特位 =1字节),为什么是8比特位,因为在计算机cpu中,8位地址线进行传输。
因此:(AD0~AD7)就是地址线,感兴趣的话,可以重温一下计算机组成原理
在32位机器上,一次能读4个字节,也就是32位比特位
在64位机器上,一次能读8个字节,也就是64位比特位
回到正题!
在一般的个人计算机中,内存内部被分割成了若干个数据存储单元,每个单元可以存储8比特位的数据(1字节),为了区分各个单元,每个单元都被分配了一个编号,这个编号也就是地址。
如果一个人计算机装配有64M内存,那么就会有0~6400万个地址,想想要是查找的时候,是不是超麻烦!那么内存的物理结构和程序关系是什么?
后续会详细的解说这块内容!!!!!
结束语:老衲,你理解了吗?