diff --git a/docs/notes/01_c-basic/05_xdx/assets/24.jpeg b/docs/notes/01_c-basic/05_xdx/assets/24.jpeg new file mode 100644 index 0000000..f6b402b Binary files /dev/null and b/docs/notes/01_c-basic/05_xdx/assets/24.jpeg differ diff --git a/docs/notes/01_c-basic/05_xdx/assets/25.gif b/docs/notes/01_c-basic/05_xdx/assets/25.gif new file mode 100644 index 0000000..3f0af7c Binary files /dev/null and b/docs/notes/01_c-basic/05_xdx/assets/25.gif differ diff --git a/docs/notes/01_c-basic/05_xdx/assets/26.gif b/docs/notes/01_c-basic/05_xdx/assets/26.gif new file mode 100644 index 0000000..17e30fd Binary files /dev/null and b/docs/notes/01_c-basic/05_xdx/assets/26.gif differ diff --git a/docs/notes/01_c-basic/05_xdx/assets/27.png b/docs/notes/01_c-basic/05_xdx/assets/27.png new file mode 100644 index 0000000..a2d113f Binary files /dev/null and b/docs/notes/01_c-basic/05_xdx/assets/27.png differ diff --git a/docs/notes/01_c-basic/05_xdx/assets/28.svg b/docs/notes/01_c-basic/05_xdx/assets/28.svg new file mode 100644 index 0000000..f896972 --- /dev/null +++ b/docs/notes/01_c-basic/05_xdx/assets/28.svg @@ -0,0 +1,4 @@ + + + +
如何保存?
2
2
8
5
1
100
102
...
内存条
程序
\ No newline at end of file diff --git a/docs/notes/01_c-basic/05_xdx/assets/29.svg b/docs/notes/01_c-basic/05_xdx/assets/29.svg new file mode 100644 index 0000000..397b5a0 --- /dev/null +++ b/docs/notes/01_c-basic/05_xdx/assets/29.svg @@ -0,0 +1,4 @@ + + + +
2
如何获取?
2
8
5
1
100
102
...
内存条
程序
\ No newline at end of file diff --git a/docs/notes/01_c-basic/05_xdx/assets/30.svg b/docs/notes/01_c-basic/05_xdx/assets/30.svg new file mode 100644 index 0000000..50e6f80 --- /dev/null +++ b/docs/notes/01_c-basic/05_xdx/assets/30.svg @@ -0,0 +1,4 @@ + + + +
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
字节
内存条
\ No newline at end of file diff --git a/docs/notes/01_c-basic/05_xdx/assets/31.svg b/docs/notes/01_c-basic/05_xdx/assets/31.svg new file mode 100644 index 0000000..7891ad7 --- /dev/null +++ b/docs/notes/01_c-basic/05_xdx/assets/31.svg @@ -0,0 +1,4 @@ + + + +
字节(001)
字节(008)
字节(015)
字节(022)
字节(029)
字节(036)
字节(043)
字节(050)
字节(057)
字节(002)
字节(009)
字节(016)
字节(023)
字节(030)
字节(037)
字节(044)
字节(051)
字节(058)
字节(003)
字节(010)
字节(017)
字节(024)
字节(031)
字节(038)
字节(045)
字节(052)
字节(059)
字节(004)
字节(011)
字节(018)
字节(025)
字节(032)
字节(039)
字节(046)
字节(053)
字节(060)
字节(005)
字节(012)
字节(019)
字节(026)
字节(033)
字节(040)
字节(047)
字节(054)
字节(061)
字节(006)
字节(013)
字节(020)
字节(027)
字节(034)
字节(041)
字节(048)
字节(055)
字节(062)
字节(007)
字节(014)
字节(021)
字节(028)
字节(035)
字节(042)
字节(049)
字节(056)
字节(063)
内存条
\ No newline at end of file diff --git a/docs/notes/01_c-basic/05_xdx/assets/32.gif b/docs/notes/01_c-basic/05_xdx/assets/32.gif new file mode 100644 index 0000000..0ad9999 Binary files /dev/null and b/docs/notes/01_c-basic/05_xdx/assets/32.gif differ diff --git a/docs/notes/01_c-basic/05_xdx/assets/33.jpg b/docs/notes/01_c-basic/05_xdx/assets/33.jpg new file mode 100644 index 0000000..ef579fa Binary files /dev/null and b/docs/notes/01_c-basic/05_xdx/assets/33.jpg differ diff --git a/docs/notes/01_c-basic/05_xdx/assets/34.jpg b/docs/notes/01_c-basic/05_xdx/assets/34.jpg new file mode 100644 index 0000000..3f5b674 Binary files /dev/null and b/docs/notes/01_c-basic/05_xdx/assets/34.jpg differ diff --git a/docs/notes/01_c-basic/05_xdx/assets/35.gif b/docs/notes/01_c-basic/05_xdx/assets/35.gif new file mode 100644 index 0000000..09955f8 Binary files /dev/null and b/docs/notes/01_c-basic/05_xdx/assets/35.gif differ diff --git a/docs/notes/01_c-basic/05_xdx/assets/36.gif b/docs/notes/01_c-basic/05_xdx/assets/36.gif new file mode 100644 index 0000000..27f1cf7 Binary files /dev/null and b/docs/notes/01_c-basic/05_xdx/assets/36.gif differ diff --git a/docs/notes/01_c-basic/05_xdx/index.md b/docs/notes/01_c-basic/05_xdx/index.md index 3c2f4e0..1d9c591 100644 --- a/docs/notes/01_c-basic/05_xdx/index.md +++ b/docs/notes/01_c-basic/05_xdx/index.md @@ -1384,3 +1384,144 @@ int main() { } ``` + + +# 第六章:内存中的变量和数组(⭐) + +## 6.1 内存和内存地址 + +### 6.1.1 内存 + +* `内存`是一种`计算机硬件`,就是`软件`在`运行过程`中,用来`临时存储数据`的。在生活中,最为常见的`内存`就是`随机存取存储器(RAM,内存条`),其特点如下所示: + * ① 生活中最常见的内存类型,用于存储当前运行的程序和数据。 + * ② 内存是易失性存储器,这意味着断电后数据会丢失。 + * ③ 它具有高速读写特性,适用于需要快速访问的操作。 + +* 内存条的外观,如下所示: + +![](./assets/24.jpeg) + +* 像我们平常使用`记事本`软件一样,当我们输入一些文字的时候,其实是将数据`临时`保存在内存中的,如下所示: + +> [!NOTE] +> +> * ① 目前,很多软件都很智能,如果用户没有将数据到保存文件中,将显示红色,以警告用户还没有保存数据,提醒用户需要尽快保存数据!!! +> * ② 但是,也有很多软件提供了自动保存数据的功能,其原理就是定时(1s、3s、5s)将内存中的数据刷新到文件中,以防止数据丢失!!! +> * ③ 将数据从内存存储到文件中,专业的说法是落盘(落在磁盘上)。 + +![](./assets/25.gif) + +* 此时,如果我们在没有保存的过程下,将`记事本`软件关闭,那么刚才输入的文字将丢失;下次,再打开同样的文件(将数据从磁盘加载进内存,再交给 CPU),之前输入的文字将不复存在,如下所示: + +> [!NOTE] +> +> * ① 目前,很多软件都很智能,如果你没有保存,将提醒你是否保存或丢失刚才输入的文字。 +> * ② 但是,也有很多软件提供了自动保存数据的功能,其原理就是定时(1s、3s、5s)将内存中的数据刷新到文件中,以防止数据丢失!!! +> * ③ 将数据从内存存储到文件中,专业的说法是落盘(落在磁盘上)。 + +![](./assets/26.gif) + +> [!IMPORTANT] +> +> 内存就是软件在运行过程中,用来临时存储数据的,最为重要的两个步骤就是: +> +> * ① 将数据`保存`到内存中。 +> * ② 从内存中的`对应位置`将数据`取出来`。 + +### 6.1.2 内存地址 + +* 在这个计算机的内存条,动不动就 32GB、64GB 、128GB 或更高的年代,如下所示: + +![](./assets/27.png) + +* 如果有一个 int (4 个字节)类型的数据 `2` ,如何将这个数据保存到内存中?(对应上述的步骤 ①) + +![](./assets/28.svg) + +* 就算数据 `2` 已经保存到内存中,那么内存中那么多的数据,我们又该如何取出呢?(对应上述的步骤 ②) + +![](./assets/29.svg) + +> [!IMPORTANT] +> +> 答案就是`内存地址`。 + +* 操作系统为了更快的去管理内存中的数据,会将`内存条`按照`字节`划分为一个个的`单元格`,如下所示: + +![](./assets/30.svg) + +> [!NOTE] +> +> 计算机中存储单位的换算,如下所示: +> +> - 1 B = 8 bit。 +> - 1 KB = 1024 B。 +> - 1 MB = 1024 KB。 +> - 1 GB = 1024 MB。 +> - 1 TB = 1024 GB 。 +> - …… + +* 为了方便管理,每个独立的小单元格,都有自己唯一的编号(内存地址),如下所示: + +![](./assets/31.svg) + +* 之所以,加了内存地址,就能加快数据的存取速度,可以类比生活中的`字典`: + + * 如果没有使用`拼音查找法`或`部首查找法`,我们需要一页一页,一行一行的在整个字典中去搜索我们想要了解的汉字。 + + ![](./assets/32.gif) + + * 如果使用`拼音查找法`或`部首查找法`,我们可以很快的定位到所要了解汉字的所在的页数,加快了搜索的效率。 + + ![](./assets/33.jpg) + + ![](./assets/34.jpg) + +* 同样的道理,如果`没有`内存地址,我们只能一个个的去寻找想要的数据,效率非常低下,如下所示: + +![](./assets/35.gif) + +* 如果`使用`内存地址,我们就可以直接定位到指定的数据,效率非常高,如下所示: + +![](./assets/36.gif) + +> [!IMPORTANT] +> +> * ① 内存地址是计算机中用于标识内存中某个特定位置的数值。 +> * ② 每个内存单元都有一个唯一的地址,这些地址可以用于访问和操作存储在内存中的数据。 + + + +* 实际中的内存地址,并不是像上面的 `001` 、`002` 、... 之类的数字,而是有自己的规则,即:内存地址规则。 + +> [!NOTE] +> +> * ① 32 位的操作系统中,内存地址以 32 位的二进制表示。 +> * ② 64 位的操作系统中,内存地址以 64 位的二进制表示。 + +* 在 32 位的操作系统中,内存地址的范围是:`0000 0000 0000 0000 0000 0000 0000 0000` ~ `1111 1111 1111 1111 1111 1111 1111 1111` (2 ^ 32 次方)。 + +> [!NOTE] +> +> 在 32 位的操作系统中,一共有 4,294,967,296 个内存地址,其最大支持的内存大小是 4,294,967,296 字节,即 4 GB 。 + +* 在 64 位的操作系统中,内存地址的范围是:`0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000` ~ `1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111` (2 ^ 64 次方)。 + +> [!NOTE] +> +> * ① 在 64 位的操作系统中,一共有 18,446,744,073,709,551,616个内存地址,其最大支持的内存大小是 18,446,744,073,709,551,616 字节,即 17,179 TB 。 +> * ② 虽然,从理论上 64 位的操作系统支持的内存最大容量是 17,179 TB;但是,实际操作系统会有所限制,如:win11 的 64 位支持的最大内存是 128 GB ~ 6 TB,Linux 64 位支持的最大内存通常是 256 TB。 + +* 在实际开发中,64 位操作系统的内存地址表现形式,如:`0000 0000 0000 0000 0001 0000 1111 1010 0000 0000 0010 0000 0000 0010 0000 1000`,实在是太长了,我们通常转换为十六进制,以方便阅读,如:`0x000010FA00200208` 。 + +> [!IMPORTANT] +> +> 总结: +> +> * ① 内存地址是内存中每个单元的编号。 +> * ② 内存地址的作用是操作系统用来快速管理内存空间的。 +> * ③ 在 32 位操作系统上,内存地址以 32 位的二进制数字表示,最大支持的的内存是 4 GB,所以 32 位操作系统已经被淘汰。 +> * ④ 在 64 位操作系统上,内存地址以 64 位的二进制数字表示,由于表示形式太长,我们通常会转为十六进制,以方便阅读。 + +## 6.2 内存中的变量 +