关于下面指针声明的说法,正确的是( )。
int a = 10;
int b = 20;
const int *p = &a;看到 const int *p 先想"指针指向常量",即 *p 不可变,但 p 本身可变。选项逐个验证:A 错在试图修改 *p;C 错在把指针本身也当成常量;D 错在认为指针不能重定向。只有 B 符合指针可赋值的基本规则。
选项 C 是最大陷阱,很多考生把 const int *p 误读为"指针和值都不能变",忽略了 const 只修饰被指向对象。选项 D 也常因"p 被初始化为 &a"而误判,其实指针变量本身可被重新赋值。
本题考查 GESP 四级《C++ 程序设计》中"指针基础"模块。命题人卡住的是考生对 const 修饰符作用范围的认知——四级考生普遍知道 const 能修饰变量,但很少意识到它修饰指针时只约束"被指向的值"而非"指针本身"。
看到 const int *p = &a; 先拆解语法:const 修饰的是 int,即被指向的对象是常量,*p 不可变;p 作为指针变量,其地址本身可被修改。
逐项验证:
*p = 100; 会编译错误,因为 *p 是常量,排除。p = &b; 合法,指针变量可重新赋值,正确。p 初始化为 &a 后仍可改为 &b,排除。