- 一、基础概念:变量和内存
先我们需要明白,计算机中的每个变量都存储在内存的某个位置。
就像酒店里每个房间都有房间号一样,内存中的每个位置也有自己的"房间号" - 这就是内存地址。
- 普通变量
int age = 25;
- 在内存中分配一个"房间" - int类型(通常是4字节大小)
- 房间号(地址)- 01xx 由系统自动决定
- 房间内 - 地址 存储的是值25
- 我们可以直接用age来访问这个值
个人理解:
常规变量int age = 25; 中变量名age 是指向内存地址(0x1000),
内存地址指向25(注意这里指向不是指针的意思),
实际就是变量名就是内存地址(0x1000),
只不过是编译器给内存地址起的"别名"(方便人类记忆的名字)
变量 int age = 25; 的内存关系:
编译后,age 会被替换为具体的内存地址
age是编译器给某个内存地址起的名字,那个地址存储着值25
- 内存中的实际情况:
[内存地址] [存储内容] [变量名]
0x1000 25 age假设系统为 age 分配了地址 0x1000
当你写 age 时,编译器知道你要访问 0x1000 地址的值
当你写 &age 时,得到的就是 0x1000
- 与指针的关键区别:
普通变量 age:直接关联到存储值的内存位置
指针变量 int *p = &age;:是一个专门存储地址的变量
表达方式 | 含义 | 示例值 |
---|---|---|
age | 直接获取存储的值 | 25 |
&age | 获取变量所在的内存地址 | 0x1000 |
int *p = &age | 指针p存储的是age的地址 | p = 0x1000 |
*p | 通过指针获取age的值 | 25 |
- 对指针与常规变量的存储取值理解
假设有以下代码:
int age = 25;
int *p_age = &age; //将age的地址赋值给p_age
内存布局可能是:
[变量] [地址] [存储内容]
age 0x1000 25
p_age 0x2000 0x1000 (age的地址)
当你在代码中写:
age → 直接从地址0x1000中读取值25
&age → 得到0x1000 ,&是取地址符
p_age → 读取0x2000的值0x1000
*p_age → 先读p_age的值0x1000,再去0x1000读值25 //* 是解引用
理解:指针(*p) -> 指向本身的内存地址(0x2000) -> 指向被赋值的给指针的内存地址(0x1000) -> 指向被赋值的给指针的内存地址中的值(25)