diff --git a/docs/notes/01_c-basic/06_xdx/assets/4.svg b/docs/notes/01_c-basic/06_xdx/assets/4.svg new file mode 100644 index 0000000..7891ad7 --- /dev/null +++ b/docs/notes/01_c-basic/06_xdx/assets/4.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/06_xdx/assets/5.png b/docs/notes/01_c-basic/06_xdx/assets/5.png new file mode 100644 index 0000000..9c383d6 Binary files /dev/null and b/docs/notes/01_c-basic/06_xdx/assets/5.png differ diff --git a/docs/notes/01_c-basic/06_xdx/assets/6.svg b/docs/notes/01_c-basic/06_xdx/assets/6.svg new file mode 100644 index 0000000..9da4367 --- /dev/null +++ b/docs/notes/01_c-basic/06_xdx/assets/6.svg @@ -0,0 +1,4 @@ + + + +
内存条
00000000
num(变量)
内存地址:0x0012FF44
程序
内存地址:0x0012FF44
00000000
00000000
00001010
10 的二进制
\ No newline at end of file diff --git a/docs/notes/01_c-basic/06_xdx/assets/7.svg b/docs/notes/01_c-basic/06_xdx/assets/7.svg new file mode 100644 index 0000000..52aa890 --- /dev/null +++ b/docs/notes/01_c-basic/06_xdx/assets/7.svg @@ -0,0 +1,4 @@ + + + +
内存条
00000000
num(变量)
内存地址:0x0012FF44
程序
内存地址:0x0012FF44
00000000
00000000
00001010
10 的二进制
p(变量)
内存地址:0x0022FF44
00000000
00010010
11111111
01000100
内存地址:0x0022FF44
0x0012FF44 的二进制
\ No newline at end of file diff --git a/docs/notes/01_c-basic/06_xdx/index.md b/docs/notes/01_c-basic/06_xdx/index.md index e55f20d..4b613cd 100644 --- a/docs/notes/01_c-basic/06_xdx/index.md +++ b/docs/notes/01_c-basic/06_xdx/index.md @@ -208,13 +208,101 @@ # 第三章:指针的理解和定义(⭐) -## 4.1 概述 +## 3.1 变量的访问方式 -* +* 计算机中程序的运行都是在内存中进行的,变量也是内存中分配的空间,且不同类型的变量占据的空间大小不同,如:char 类型的变量是 1 个字节,short 类型的变量是 2 个字节,int 类型的变量是 4 个字节... +* 之前我们都是通过`变量名(普通变量)`访问内存中存储的数据,如下所示: + +```c +#include + +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 + +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`。