mirror of
https://github.com/Aexiar/c.git
synced 2024-10-22 14:05:45 +02:00
c
This commit is contained in:
parent
4c7a88ce9b
commit
4213456bb8
4
docs/notes/01_c-basic/06_xdx/assets/4.svg
Normal file
4
docs/notes/01_c-basic/06_xdx/assets/4.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 452 KiB |
BIN
docs/notes/01_c-basic/06_xdx/assets/5.png
Normal file
BIN
docs/notes/01_c-basic/06_xdx/assets/5.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
4
docs/notes/01_c-basic/06_xdx/assets/6.svg
Normal file
4
docs/notes/01_c-basic/06_xdx/assets/6.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 71 KiB |
4
docs/notes/01_c-basic/06_xdx/assets/7.svg
Normal file
4
docs/notes/01_c-basic/06_xdx/assets/7.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 133 KiB |
@ -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 调试时,可以通过反编译代码来查看指针变量和普通变量的区别。下面是具体的步骤:
|
||||
|
||||
@ -283,15 +371,15 @@ int main() {
|
||||
|
||||
|
||||
|
||||
# 第五章:指针的运算(⭐)
|
||||
# 第四章:指针的运算(⭐)
|
||||
|
||||
## 5.1 概述
|
||||
## 4.1 概述
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
## 5.2 总结
|
||||
## 4.2 总结
|
||||
|
||||
* 在 C 语言中,`普通变量`是直接存储`数据`的`变量`。对于普通变量,支持的操作包括:
|
||||
* ① **赋值操作**:给变量赋值,如:`int a = 5`。
|
||||
|
Loading…
Reference in New Issue
Block a user