变量的两个身份
把内存想成一条格子街,每格都有唯一门牌。执行 int x = 10,x 分到一格:盒子里的值是 10,盒子上的门牌是它的地址。平时写 x 用的是值,而指针玩的就是门牌——&x 拿到的不是 10,是门牌号本身。
p 是门牌,*p 是屋里的东西
int *p = &x 把 x 的门牌装进 p。此后 *p 就是顺着门牌走到那格取值,和读 x 一模一样;而 *p = 20 是往那格写 20——没有一行代码直接写 x,x 却真的变成了 20,因为 *p 和 x 是同一格内存。少个 * 意思完全两样:p = 20 是让 p 指向门牌 20 那格(非法地址)。
scanf 的 & 和空指针 NULL
scanf("%d", &x) 的谜底:scanf 要把读到的数写进你的变量,所以必须递门牌(&x)而不是值,它拿到地址后做的和 *p = 20 是同一套动作。忘写 & 就是把 10 当地址乱写,轻则读不进,重则崩溃。
指针暂时没目标时显式赋 NULL,表示「哪都不指」;但对 NULL 解引用会直接崩溃,动 *p 前先判空。调试时可用 printf("%p", (void*)p) 把地址打出来看指没指对。