小杨在调试一个“等级提升”系统,代码逻辑如下,执行后 *p 的值是( )。
int lv = 5, next_lv = 6;
int *p = &lv;
*p = *p + 1;
p = &next_lv;答案B。根据计算机/编程基础知识分析判断。
关键提醒:C++中的^是异或运算符,不是乘方!2^5=7而非32。这是最高频的错误。
【考点】指针与变量引用|变量赋值|指针重定向
【解题思维】这道题必须按执行顺序逐行跟踪:int lv = 5, next_lv = 6; 初始化两个变量;int *p = &lv; 让指针 p 指向 lv;*p = *p + 1; 因为 *p 就是 lv,所以执行的是 lv = lv + 1,lv 从 5 升为 6(注意这里改的是 lv 的值,不是 p 本身);p = &next_lv; 最后 p 被重新赋值指向 next_lv。问的是此时 *p 的值——p 指向 next_lv,*p 就是 next_lv 的值 6,选 B。
【陷阱拆解】A 项是典型误读:把 *p 当成 p 本身而非它所指向的变量值,以为 *p 仍为 5;C 项偷换概念:将 *p 解释为"lv 的地址",混淆值与地址;D 项看似正确实则偷梁换柱:p 确实等于 next_lv 的地址,但题目问的是 *p(地址解引用后的值)而非 p(地址本身)。最阴险的是 *p = *p + 1; 这一行——它直接修改了 lv 的值,但很多考生会忽略指针指向的变量是 lv 而非 next_lv,导致后续判断出错。
【反命题思维】命题人若把 p = &next_lv; 移到 *p = *p + 1; 之前,答案将变为 7(next_lv 被累加);若问的是 p 的值而非 *p,答案就是 &next_lv;若问 *p 在重定向前的值,答案仍是 6。刷到这类题先问自己:题目到底想考指针指向的变量,还是指针本身?别被符号迷惑。