This commit is contained in:
许大仙 2024-08-08 10:25:06 +08:00
parent 4c7a88ce9b
commit 4213456bb8
5 changed files with 106 additions and 6 deletions

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 452 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 71 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 133 KiB

View File

@ -208,13 +208,101 @@
# 第三章:指针的理解和定义(⭐) # 第三章:指针的理解和定义(⭐)
## 4.1 概述 ## 3.1 变量的访问方式
* * 计算机中程序的运行都是在内存中进行的变量也是内存中分配的空间且不同类型的变量占据的空间大小不同char 类型的变量是 1 个字节short 类型的变量是 2 个字节int 类型的变量是 4 个字节...
* 之前我们都是通过`变量名(普通变量)`访问内存中存储的数据,如下所示:
```c
#include <stdio.h>
int main() {
// 定义变量,即:开辟一块内存空间,并将初始化值存储进去
int num = 10;
// 访问变量,即:访问变量在内存中对应的数据
printf("num = %d\n", num);
// 给变量赋值,即:给变量在内存中占据的内存空间存储数据
num = 100;
// 访问变量,即:访问变量在内存中对应的数据
printf("num = %d\n", num);
return 0;
}
```
* 上述的这种方式也称为`直接访问`;当然,既然有`直接访问`的方式,必然有`间接访问`的方式,如:`指针`。
> [!IMPORTANT]
>
> * ① 我们通过`变量名(普通变量)`访问内存中变量存储的数据,之所以称为`直接访问`的方式,是因为对于我们写程序而言,我们无需关心如何根据内存地址去获取变量对应的数据,以及如何根据内存地址将数据存储到对应的内存空间,这些操作步骤都是`编译器`帮助我们在底层完成的(自动化)。
> * ② 但是,我们也可以通过`内存地址`去操作内存中对应的数据(手动化),这种方式就称为`间接访问`的方式了,相对于`直接访问`方式来说,要理解的概念和操作的步骤要比之间`直接访问`方式要多很多,但是效率高。
## 3.2 内存地址和指针
* 其实,在之前《数组》中,我们就已经讲解了`内存地址`的概念了,即:操作系统为了更快的去管理内存中的数据,会将`内存条`按照`字节`划分为一个个的`单元格`,并为每个独立的小的`单元格`,分配`唯一的编号`,即:`内存地址`,如下所示:
![](./assets/4.svg)
> [!NOTE]
>
> 有了内存地址,就能加快数据的存取速度,可以类比生活中的`字典`,即:
>
> * ① 内存地址是计算机中用于标识内存中某个特定位置的数值。
> * ② 每个内存单元都有一个唯一的地址,这些地址可以用于访问和操作存储在内存中的数据。
* 对于之前的代码,如下所示:
```c
#include <stdio.h>
int main() {
// 定义变量,即:开辟一块内存空间,并将初始化值存储进去
int num = 10;
return 0;
}
```
* 其在内存中,就是这样的,如下所示:
![](./assets/5.png)
* 虽然,之前我们在程序中都是通过`变量名(普通变量)`直接操作内存中的存储单元;但是,编译器底层还是会通过`内存地址`来找到所需要的存储单元,如下所示:
![](./assets/6.svg)
> [!NOTE]
>
> 通过`内存地址`找到所需要的`存储单元`,即:内存地址指向该存储单元。此时,就可以将`内存地址`形象化的描述为`指针👉`,那么:
>
> * ① `变量`:命名的内存空间,用于存放各种类型的数据。
> * ② `变量名`:变量名是给内存空间取一个容易记忆的名字,方便我们编写程序。
> * ③ `变量值`:变量所对应的内存中的存储单元中存放的数据值。
> * ④ `变量的地址`:变量所对应的内存中的存储单元的内存地址,也可以称为`指针`。
>
> 总结:内存地址 = 指针。
* `普通变量`所对应的内存空间`存储`的是`普通的值`,如:整数、小数、字符等;`指针变量`所对应的内存空间`存储`的是另外一个变量的`地址(指针)`,如下所示:
![](./assets/7.svg)
> [!NOTE]
>
> 有的时候,为了方便阐述,我们会将`指针变量`称为`指针`。但是,需要记住的是:
>
> * 指针 = 内存地址。
> * 指针变量 = 变量中保存的是另一个变量的地址。
>
> 下文中提及的`指针`都是`指针变量`,不再阐述!!!
## 4.2 普通变量和指针变量的区别 ## 3.2 普通变量和指针变量的区别
在 CLion 中使用 GDB 调试时,可以通过反编译代码来查看指针变量和普通变量的区别。下面是具体的步骤: 在 CLion 中使用 GDB 调试时,可以通过反编译代码来查看指针变量和普通变量的区别。下面是具体的步骤:
@ -283,15 +371,15 @@ int main() {
# 第章:指针的运算(⭐) # 第章:指针的运算(⭐)
## 5.1 概述 ## 4.1 概述
## 5.2 总结 ## 4.2 总结
* 在 C 语言中,`普通变量`是直接存储`数据`的`变量`。对于普通变量,支持的操作包括: * 在 C 语言中,`普通变量`是直接存储`数据`的`变量`。对于普通变量,支持的操作包括:
* ① **赋值操作**:给变量赋值,如:`int a = 5`。 * ① **赋值操作**:给变量赋值,如:`int a = 5`。