1. 内存地址

1.1 内存地址定义

计算机中数据存储/数据操作的最小数据单位为 byte 字节,一个字节对应 8 个二进制位,开发中如果需要操作二进制/bit 位数据,需要依赖于字节手段操作。

计算机为了更好的操作内存,按照内存的最小数据单位字节,逐一编号。类似于: 门牌号,莲花街55号,航海路60号

以 4GB 内存为例,内存地址范围是 0 ~ 4,294,967,295,为了方便操作计算机针对于内存地址数据的描述形式采用十六进制完成,对应地址为 0x0 ~ 0xFFFF FFFF

1.2 内存地址有什么用

内存地址对应 CPU 而言是一个指向性的数据,如果 CPU 在操作程序时得到了某一块内存的首地址,CPU 可以根据对应的内存地址,【立刻,马上,立即,高速】跳转到对应的内存位置【可以认为是游戏中指定位置闪现操作】,速度非常快,效率非常高!!!

开发中任何一个变量,任何一个函数,任何一段代码在内存中都有对应的内存地址,可以通过内存地址操作对应的内存空间,可以完成跨区域,跨范围的操作。

1.3 特殊内存

内存中编号为 0 的字节,十六进制地址为 0x0 , 特殊标识符 null。受到系统保护,任何程序,任何代码不得读取数据或者写入数据到对应内存中。

可以用于指针变量初始化,避免野指针问题。同时可以利用 null 无法读写的特征,在代码运行过程中作为指针操作的提示项,避免出现

  • 内存地址未分配
  • 内存空间无效

2. 指针

2.1 指针概述

指针是一个存储目标内存地址的变量,变量中存储的数据是一个【地址】。

【指针没有类型,仅仅是一个存储地址的变量】

定义指针变量的格式

数据类型 * 指针变量名 = 初始化地址;
  • 数据类型:
    • CPU 通过当前指针变量存储的地址,访问对应的内存空间。当前数据类型限制两个行为
    • 内存获取的字节个数
    • 提取指定字节个数内存之后,对应内存 CPU 认知的数据类型是什么
  • :
    • C/C++ 中指针变量特征定义标记,定义变量过程看到 * 当前变量为指针变量
  • 指针变量名:
    • 【见名知意,约定俗成】在一定范围内唯一。存储目标内存地址
  • 初始化地址:
    • 一般情况下,指针变量如果没有明确的内存地址需要存储,都会初始化为 null
    • 如果有明确的地址信息需要存储,直接赋值对应内存即可。

2.2 定义指针和指针操作相关运算符

针对于指针和地址操作有两个关键的运算符

  • & : 取地址运算符,可以获取变量在内存中的空间首地址
  • *** : 取值运算符,CPU 可以根据当前指针变量存储的地址访问对应内存空间,同时根据指针定义时对应数据类型,提取指定字节个数内存和处理为对应数据类型。**
#include <stdio.h>

int main(int argc, char const *argv[])
{
    /*
    int 类型变量,在当前系统环境下占用内存 4 个字节空间
    */
    int num = 100;

    /*
    定义了一个指针变量 p,存储 int 类型数据变量 num 在内存
    空间的首地址。
    &num 获取 num 变量在内存空间的首地址

    CPU 会根据当前内存首地址访问对应的内存空间,根据数据类型 int
    类型获取 4 个字节内存数据,处理为 int 类型结果。
    */
    int *p = #

    printf("p = %p\n", p);

    /*
    利用 * 取值运算符,操作指针变量,告知 CPU 通过当前指针存储的内存
    地址访问目标内存空间,处理为 int 数据类型。
    */
    printf("*p = %d\n", *p);

    return 0;
}