很多刚学 C 语言指针的同学都会被这行代码绕晕int *b malloc(sizeof(int)); *b 10;甚至有人会说「*b 10就是解引用意思是b里面存的是 10」——这是完全错误的理解。今天我们就用代码和内存模型把这个问题彻底讲清楚。一、先纠正核心误区 ❌错误表述*b 10就是解引用意思是b里面存的是 10。正确解释 ✅*b 10是解引用赋值操作b本身是一个指针变量它存储的是「一段内存的地址」不是数值 10*b表示「通过b中存储的地址找到对应的内存空间」*b 10是把数值10写入到b指向的那块内存里而不是写到b变量本身。可以用一个生活比喻来理解b就像一个门牌号地址*b才是门牌号对应的房间内存空间*b 10就是往这个房间里放数字 10而不是把门牌号改成 10。二、代码验证眼见为实我们写一段可运行的代码通过打印地址和值直观验证上面的结论。代码一#include stdio.h int main() { int a 5;。//先给a赋值5 int *b a; // b 存储 a 的内存地址 *b 10; // 解引用修改 a 所在的内存 printf(a 的值%d\n, a); // 输出10验证 *b 修改的是 a 的内存 printf(b 存储的地址%p\n, b); // 输出和 a 完全一致 printf(*b 的值%d\n, *b); // 输出10 return 0; }运行后你会发现a的值被改成了 10—— 这再次证明*b 10是在修改b指向的内存而不是b本身。如下图模型代码二#include stdio.h #include stdlib.h int main() { // 1. 定义栈上普通整型变量 int a 5; // 2. 定义指针变量b分配堆内存与图中代码完全一致 int *b (int*)malloc(sizeof(int)); // 3. 核心操作解引用赋值与图中代码完全一致 *b 10; // 打印验证信息 printf( 变量 a 的信息 \n); printf(a 的值%d\n, a); printf(a 的地址%p\n, a); printf(\n 指针 b 的信息 \n); printf(b 自身的地址%p\n, b); printf(b 存储的地址(指向的地址)%p\n, b); printf(b 解引用后的值(指向的值)即*b%d\n, *b); // 额外验证修改解引用值 *b 20; printf(\n修改 *b 20 后\n); printf(b 解引用后的值(指向的值)%d\n, *b); printf(b 存储的地址不变%p\n, b); // 验证地址本身不会被修改 // 释放堆内存避免内存泄漏 free(b); b NULL; // 释放后置空防止野指针 return 0; }从输出可以清晰看到b里存的是一个16位进制内存地址0000000000B213F0不是 10*b才是这个地址0000000000B213F0对应的数值10修改*b只会改变指针b指向的内存地址(堆内存)里存储的值不会改变b本身三、内存模型可视化结合上述的图我们修正后的正确模型应该是这样的内存区域变量存储内容含义栈内存a5普通整型变量值为 5栈内存b堆内存地址指针变量存储指向堆内存的地址堆内存—10b指向的内存空间存储数值 10图里的连线是对的但文字解释错了❌ 错误*b 10就是b里面存的是 10✅ 正确*b 10是把 10 放到b指向的堆内存里b本身存的是地址。四、总结指针本身 ≠ 指针指向的内容b是地址*b才是地址对应的数值解引用的本质*b 10是「通过地址找到内存再往里面写值」不是修改地址本身验证方法打印指针地址和解引用值一眼就能分清区别。下次再看到*b x时别再说「b里存的是x」啦要记得b存的是地址x住在地址指向的房间里。