int& a 和 &a 是一样的,都是取 a 的地址。
答案B。指针变量存储的是内存地址。定义指针时必须指定指向的类型(如int*指向int)。nullptr表示空指针。
指针必须先初始化再使用。nullptr是空指针常量,不指向任何有效内存。解引用空指针导致崩溃。
【考点】引用|指针|地址操作符
1. 考纲定位 本题考查核心是 C++ 引用与指针的本质区别,对应 GESP 四级 C++ 大纲中"引用与指针"模块。命题人专门挖这个坑,就是卡住那些把"引用"和"指针"混为一谈的考生——很多人背过"引用就是指针"的结论,却从未真正理解两者在内存模型中的实现差异。
2. 解题思维 看到 int& a 和 &a 并列,第一步要识别类型:前者是引用类型,后者是取地址后得到的指针类型。第二步看语义:int& a 中的 a 本身就是对某个整型变量的一种别名,不产生新内存单元;而 &a 是对 a 这个引用对象再次取地址,由于引用本身没有独立存储位置,&a 返回的是引用所绑定的那个原始变量的地址。第三步对比:一个是引用类型(非指针),一个是指针类型(int*),类型不同、语义不同、用途不同,自然不可能"一样"。通法:判断两个表达式是否相同,先看类型是否一致,再看语义是否等价,最后用类型和语义双维度排除错误选项。
3. 陷阱拆解 A 选项的错误设计利用了"引用就是指针"的模糊记忆,其实引用是编译期别名,指针是运行时可变的地址容器,二者底层实现完全不同。更阴险的是后半句"都是取 a 的地址"——这偷换了 a 的身份:在 int& a 里 a 就是引用本身,不存在"取它的地址"这一说法;只有对 a 使用 & 运算符时,才涉及地址操作,但那得到的是原始变量的地址,而不是引用的地址。如果你只背"引用=指针",就会忽略这个语义陷阱,掉进 A 的坑里。
4. 反命题思维 命题人若把题目改成 int* a 和 &a,二者就是同一类型,答案会立刻变成 A;若改成 int& a 和 *a,前者是引用后者是值,则又变成 B。刷到这类题,先问自己:命题人是不是在考类型一致性?再看表达式里有没有隐式的地址操作或值提取,就能避开陷阱。