4.熟练使用有棱有角的内存——摘抄笔记

4.1 内存的物理机制很简单

内存实际上是一种名为内存IC的电子元件。虽然IC包括DRAM、SRAM、ROM(Read Only Memory)等多种形式,但从外部来看,其基本机制都是一样的。
内存IC中有电源、地址信号、数据信号、控制信号灯用于输入输出的大量引脚(IC的引脚),通过为其指定地址(address),来进行数据的读写。

4.2 内存的逻辑模型是楼房

  • 1KB内存的模型
    title
  • 变量的数据类型不同,所占用的内存大小也不一样
    title

通过使用变量,即使不指定物理内存,也可以在程序中对内存进行读写。这是因为,在程序运行时,windows等操作系统会自动决定变量的物理地址。
如果程序只能逐个字节地对内存进行读写,那该多么不便。
此外,在不同的编程语言中,变量可以指定的数据类型的最大长度也不相同。
##4.3 简单的指针
指针也是一种变量,它所表示的不是数据的值,而是存储着数据的内存的地址。
和通常的变量定义有所不同,在定义指针时,我们通常会在变量名前加一个星号(*)。
各种数据类型指针的定义

char *d;    //char类型的指针d的定义
short *e;   //short类型的指针e的定义
long *f;    //long类型的指针f的定义

数据类型表示的是从指针存储的地址中一次能够读写的数据字节数。
title

在程序中,通过明确标记数据类型来记述变量的过程称为定义变量。
例如,若将其记述为short a;,则表示定义了2个字节的short类型的变量。
变量定义后就可以进行读写了。
##4.4 数组是高效使用内存的基础
数组是指多个同样数据类型的数据在内存中连续排列的形式。
作为数组元素的各个数据会通过连续的编号被区分开来,这个编号称为索引(index)
指定索引后,就可以对该索引所对应地址的内存进行读写操作。而索引和内存地址的变换工作则是由编译器实现的。

char g[100];    //char类型数组g的定义
short h[100];   //short类型数组h的定义
long i[100];    //long类型数组i的定义

之所以说数组是内存的使用方法的基础,是因为数组和内存的物理构造是一样的。
不同数据类型的数组
title

4.5 栈、队列以及环形缓冲区

栈和队列,都可以不通过指定地址和索引来对数组的元素进行读写。
需要临时保存计算过程中的数据、连接在计算机上的设备或者输入输出的数据时,都可以通过这些方法来使用内存。
如果每次保存临时数据都需指定地址和索引,程序就会变得比较麻烦,因此要加以改进。

栈和队列的区别在于数据出入的顺序是不同的。

:LIFO(Last Input First Out,后入先出)
队列:FIFO(First Input First Out,先入先出)

  1. 如果我们在内存中预留出栈和队列所需要的空间,并确定好写入和读出的顺序,就不再用指定地址和索引了。
  2. 如果要在程序中实现栈和队列,就需要以适当的元素来定义一个用来存储数据的数组,以及对该数组进行读写的函数。在这些函数的内部,对数组的读写会涉及索引的管理,但从使用函数的角度来说,就没必要考虑数组及索引了。
    队列一般是以环状缓冲区(ring buffer)的方式来实现的。
    title

这里所说的栈并不是第1章及第10章提到的函数调用时使用的栈,而是程序员自身做成的LIFO形式的数据存储方式(该栈的实体是数组)。
##4.6 链表使元素的追加和删除更容易
在数组的各个元素中,除了数据的值之外,通过为其附带上下一个元素的索引,即可实现链表

  • 链表的示例(初始状态)
    title

  • 删除链表的第3个元素的方法
    title

  • 链表中追加元素的方法
    title

    4.7 二叉查找树使数据搜索更有效

    二叉查找树是指在链表的基础上网数组中追加元素时,考虑到数据的大小关系,将其分成左右两个方向的变现形式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值