This commit is contained in:
许大仙 2024-08-07 15:14:02 +08:00
parent 9eee695226
commit 1321a86d6e
3 changed files with 99 additions and 8 deletions

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 239 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 436 KiB

View File

@ -1386,13 +1386,13 @@ int main() {
# 第章:内存中的变量和数组(⭐) # 第章:内存中的变量和数组(⭐)
## 6.1 内存和内存地址 ## 5.1 内存和内存地址
### 6.1.1 内存 ### 5.1.1 内存
* `内存`是一种`计算机硬件`是`软件`在`运行过程`中,用来`临时存储数据`的。在生活中,最为常见的`内存`就是`随机存取存储器RAM内存条`),其特点如下所示: * `内存`是一种`计算机硬件`,是`软件`在`运行过程`中,用来`临时存储数据`的。在生活中,最为常见的`内存`就是`随机存取存储器RAM内存条`),其特点如下所示:
* ① 生活中最常见的内存类型,用于存储当前运行的程序和数据。 * ① 生活中最常见的内存类型,用于存储当前运行的程序和数据。
* ② 内存是易失性存储器,这意味着断电后数据会丢失。 * ② 内存是易失性存储器,这意味着断电后数据会丢失。
* ③ 它具有高速读写特性,适用于需要快速访问的操作。 * ③ 它具有高速读写特性,适用于需要快速访问的操作。
@ -1428,7 +1428,7 @@ int main() {
> * ① 将数据`保存`到内存中。 > * ① 将数据`保存`到内存中。
> * ② 从内存中的`对应位置`将数据`取出来`。 > * ② 从内存中的`对应位置`将数据`取出来`。
### 6.1.2 内存地址 ### 5.1.2 内存地址
* 在这个计算机的内存条,动不动就 32GB、64GB 、128GB 或更高的年代,如下所示: * 在这个计算机的内存条,动不动就 32GB、64GB 、128GB 或更高的年代,如下所示:
@ -1467,11 +1467,11 @@ int main() {
* 之所以,加了内存地址,就能加快数据的存取速度,可以类比生活中的`字典` * 之所以,加了内存地址,就能加快数据的存取速度,可以类比生活中的`字典`
* 如果没有使用`拼音查找法`或`部首查找法`,我们需要一页一页,一行一行的在整个字典中去搜索我们想要了解的汉字。 * 如果没有使用`拼音查找法`或`部首查找法`,我们需要一页一页,一行一行的在整个字典中去搜索我们想要了解的汉字。
![](./assets/32.gif) ![](./assets/32.gif)
* 如果使用`拼音查找法`或`部首查找法`,我们可以很快的定位到所要了解汉字所在的页数,加快了搜索的效率。 * 如果使用`拼音查找法`或`部首查找法`,我们可以很快的定位到所要了解汉字所在的页数,加快了搜索的效率。
![](./assets/33.jpg) ![](./assets/33.jpg)
@ -1523,5 +1523,88 @@ int main() {
> * ③ 在 32 位操作系统上,内存地址以 32 位的二进制数字表示,最大支持的的内存是 4 GB所以 32 位操作系统已经被淘汰。 > * ③ 在 32 位操作系统上,内存地址以 32 位的二进制数字表示,最大支持的的内存是 4 GB所以 32 位操作系统已经被淘汰。
> * ④ 在 64 位操作系统上,内存地址以 64 位的二进制数字表示,由于表示形式太长,我们通常会转为十六进制,以方便阅读。 > * ④ 在 64 位操作系统上,内存地址以 64 位的二进制数字表示,由于表示形式太长,我们通常会转为十六进制,以方便阅读。
## 6.2 内存中的变量 ## 5.2 内存中的变量
* 在 C 语言中数据类型的种类很多short、int、long、float、double、char 等。以 int 类型为例,在 32 位或 64 位操作系统中的int 类型的变量都是占 4 个字节,当我们在代码中这么定义变量,如:
```c
#include <stdio.h>
int main(){
// 定义一个变量并初始化
int a = 10;
return 0;
}
```
* 那么,编译器就会这么处理,如下所示:
![](./assets/37.svg)
* 在代码中,我们可以使用 `&变量名` 来获取一个变量的内存首地址,如下所示:
```c
#include <stdio.h>
int main() {
// 定义一个变量并初始化
int a = 10;
printf("变量 a 的首地址是: %p\n", &a); // 变量 a 的首地址是: 0000002bf1dffd0c
printf("变量 a 的中保存的值是: %d\n", a); // 变量 a 的中保存的值是: 10
return 0;
}
```
## 5.3 内存中的数组
* 如果我们在代码中这么定义数组,如下所示:
```c
#include <stdio.h>
int main(){
// 定义一个数组并初始化
int arr[] = {1,2,3};
return 0;
}
```
* 那么,编译器就会这么处理,如下所示:
![](./assets/38.svg)
* 在代码中,我们可以直接打印数组名的内存地址,如下所示:
```c
#include <stdio.h>
int main() {
int arr[] = {1, 2, 3};
printf("arr 的首地址是: %p \n", arr); // arr 的首地址是: 0000003a6f7ffcd4
printf("arr 的首地址是: %p \n", &arr); // &arr 的地址是: 0000003a6f7ffcd4
printf("arr[0] 的地址是: %p \n", &arr[0]); // arr[0] 的地址是: 0000003a6f7ffcd4
printf("arr[1] 的地址是: %p \n", &arr[1]); // arr[1] 的地址是: 0000003a6f7ffcd8
printf("arr[2] 的地址是: %p \n", &arr[2]); // arr[2] 的地址是: 0000003a6f7ffcdc
return 0;
}
```
> [!WARNING]
>
> 在上述示例中,`arr` 和 `&arr` 的值是一样的,但是对应的含义是不同的。
>
> * ① `arr` 是数组名,在大多数情况下会转换为数组第一个元素的地址,即:`arr` 等价于 `&arr[0]`,其数据类型是 `int *`。
> * ② `&arr`是数组名的地址,即整个数组的地址,它指向数组本身,并不是数组第一个元素的地址,`&arr` 的数据类型是 `int(*)[3]`。