专栏导航
上一篇:WIndows 编程辅助技能:格式工厂的使用
回到目录
下一篇:MFC 第一章概述
本节前言
本来呢,没想着在单独的课节中讲解内存模型。但是呢,在我写过的一些个课节中,我发现,内存模型,大概还是有必要去讲一讲的。不然的话,每次涉及这一知识点的时候,我还得费劲巴力地再来讲一次,实在是麻烦。
学习本节之前,我们需要大家学习过十六进制的知识。在本专栏的预备章节中,有关于十六进制的知识的讲解。不会的话,你可以参照相应的课节,来学习进制知识。
本节,我仅仅列出讲解十六进制知识的其中几个参考课节。
课节:计算机基础:二进制基础10,用十六进制来查数
课节:计算机基础:二进制基础11,十六进制的位基和位权
课节:计算机基础:二进制基础12,十进制数转换为十六进制
课节:计算机基础:二进制基础13,十六进制与二进制的相互转换
你可以先学习本节的后续知识。遇到不会的,再去参考课节中,学习进制知识。或者,你也可以在本专栏目录中,在预备章节里面,系统地学习进制知识。
这样子说起来,也许你会觉得很麻烦。没办法,学习计算机知识,有些时候,确实是会麻烦一些。
一. 物理内存
首先呢,我们来看一看内存的实物。



上面的三张图,就是电脑里的内存条,就是物理内存。
这些个东西,对于组装电脑,升级配件的人是有用的。然而,对于程序员来讲,我们所关注的,并不是内存的物理形状。
二. 内存的抽象
程序员并不关注内存的物理形态,关心的是它在编程方面的抽象含义。
在计算机里面,有很多的地方,可以用来存储数据。在内存里面可以存储数据,在寄存器里面也可以存储数据。存储数据的最小单位,是比特。一个比特,要么存储 0,要么存储 1 。连续的 8 个比特,为一个字节。
所以呢,一个比特,它包含着 8 个二进制位,也就是包含着 8 个比特。
虽说,计算机存储数据的最小单位是比特,但是,计算机存储数据的基本单位,却不是比特,而是一个字节。
在基础的 C/C++ 学习里面,可以用来存储一个字节的数据类型有两种,一个是 signed char 型,另一个是 unsigned char 型。C 语言对于 char 数据类型究竟归属于 signed char 还是归属于 unsigned char,是没有定义的。因此,不同的编译器,可以作出不同的处理。
本专栏所采用的 Visual Studio 集成开发环境,它默认地,是将 char 数据类型视为 signed char 类型。
占用一个字节的数据类型有两个,一个是 signed char,另一个是 unsigned char 。而在这里,我们将 unsigned char 数据类型,起另外的一个名字,叫做字节型。
计算机存储数据的基本单位,是一个字节。在计算机内存里面,有很多个空间,可以用来存储数据,可以存储很多很多的字节的数据。
计算机存储数据的基本单位,是一个字节。往内存里存储数据也是一样的,最起码得是存储一个字节,不能再小了。
整个的一个内存,包含着很多很多的字节空间,每一个字节空间,都可以存储一个字节的数据。所以呢,整个的内存,可以视为一个字节空间集合。或者,我们也可以将一个内存,视为一个字节数组。
申请数组,大家应该会吧。
unsigned char str[100];
上面的代码,申请了一个字节数组,这个数组包含了 100 个字节的空间。
而计算机内存,其实也是字节数组。只是,这个数组很大很大。
本分节,我们的任务,只是希望让大家了解一个概念,那就是,在程序员的眼中,内存其实只是一个字节数组。
三. 内存大小
内存中的一个存储数据的基本单位,是一个字节,也就是一个 Byte,也写作 B 。1024 个字节,为1 个 KB 。1024 KB,为 1 兆字节,也写作 1MB 。1024 MB,为 1 吉字节,也写作 1 GB 。1024 GB,为 1 太字节,也写作 1 TB 。
1 个字节为 1B 。
1024 B = 1KB 。
1024 KB = 1MB 。
1024 MB = 1 GB 。
1024 GB = 1 TB 。
1024 等于 2 的 10 次方。
1 个字节为 1 B 。
B = 1KB 。
KB = 1MB 。
MB = 1GB 。
GB = 1TB 。
如果你的内存条,只能存储100个数据,那么,你的内存尺寸就是 100 B 。如果你的内存能够存储 1024 个数据,那么,你的内存的尺寸就是 1024 B,也就是 1KB 。如果你的内存能够存储 4096 个数据,也就是 4 × 1024 个数据,那么,你的内存的尺寸就是 4 KB 。
内存的尺寸,通常使用 MB,GB 作为计量单位。
我初中的时候,我所听到的内存尺寸,有 256 MB 的,有 512 MB 的。
后来,听说了 1GB 的,2GB,4GB 的。而现在的内存,8GB,16GB,32GB,应该都是常见的。因为,低于 4GB 的,根本就运行不了 Win10,Win11 。即使你使用的是 WIn7,Win8,估计,你的电脑,也至少安装 4GB 的内存。
以上,是我对内存尺寸的讲解。
四. 内存地址
内存中,可以用来存储数据的每一个字节空间,都有一个编号。我们在第二分节中说了,内存的本质 ,是一个尺寸很大的字节数组。这个字节大数组的数组下标,也就是这个字节数组的索引,便是这个字节空间的编号。这个字节空间的索引或编号,便是内存地址。
通常来讲,在表示内存地址的时候,我们并不使用十进制数,而是使用十六进制数。习惯上,我们使用八位十六进制数,来表示一个内存地址。
比如说,我们在程序中,申请了一个 char 型变量 ch。假定,这个 char 型变量的地址,为 0x0CE32100 。再假定,我们用 MEM 来表示内存。所以呢,将这个 char 型变量 ch 赋值为 100,相当于是将 MEM[0x0CE32100] 赋值为 100 。
一般来讲,程序中的变量的地址,都会是一个比较大的十六进制数,且这个地址值,会用八位十六进制数来表示。这看起来,也许会显得很不方便。然而,相比十进制表示法来讲,十六进制表示法,已经是帮助我们简化了一些个工作了。
你可以自己试着去编写一个 C 语言程序,在程序里面申请一个变量,并且测试和打印这个变量的地址。
比如说,我们可以编写如下的程序。
#include <stdio.h>int main()
{char ch01;char * p;p_ch = &ch01;printf("%p\n", p_ch);return 0;
}
至于说,如何建立 C/C++ 程序项目,如何编译,运行这个程序,你可以参考如下文章链接。
课节:使用 VS2010 编写 C语言程序
课节:用 VS2019 编写C语言程序
表示内存地址的时候,所使用的,是十六进制数。刚开始使用十六进制数的时候,你也许会觉得不习惯。其实,在高级语言的学习里面,我们使用十六进制的地方并不多。然而,在你以后去学习汇编语言的时候,学习十六进制的地方,自然地,会多起来。
啥时候去学习和十六进制,你可以自己来安排。但是呢,无论是早还是晚,如果你想要将编程技能练得很棒,那么,二进制,八进制,十六进制的知识,以及许多的系统底层知识,你就都需要去学习了。
至于说,学习顺序,自己摸索和安排吧。
结束语
本节的内容,就这么多吧。希望大家能够学习好本节知识。
专栏导航
上一篇:WIndows 编程辅助技能:格式工厂的使用
回到目录
下一篇:MFC 第一章概述