下面代码输出的值等于 $0$。
#include<iostream>
using namespace std;
int main()
{
int *p=NULL;
cout<<p<<endl;
}答案A。指针和数组的代码追踪:画出变量和指针的内存示意图,追踪每次赋值后值的变化。
指针和数组追踪时画内存布局图可以大大简化理解。
【考点】指针与NULL值|cout输出重载|GESP四级语法
本题考查GESP四级C++语法中指针基础与输出重载。命题人用"输出NULL"卡住那些把指针地址和指针值混淆的考生,毕竟四级不考复杂指针运算,但必须分清p本身存的是地址,而cout<<p输出的是p指向的值。
解题链条:①int *p=NULL把p初始化为0;②cout<<p调用ostream::operator<<(void*)重载,直接输出指针存储的数值(即地址);③因为p是0,所以cout输出0。通法是遇到指针输出时,先确认是输出指针本身还是解引用结果,四级只涉及指针本身。
陷阱在于绝对化表述"输出的值等于0"。若考生误以为cout输出的是p的地址(即&p),就会选错。命题人利用"指针是地址"这一常识偷换概念——p的值就是地址0,而非p变量自身的地址。只背结论"NULL输出0"而不理解cout重载机制,就会在变式题上当坑。
反命题视角:如果把cout<<p改成cout<<&p,答案就变成非零地址;若改成cout<<*p,则涉及空指针解引用,四级范围外但可推演为异常。刷到类似题时,先问自己"命题人想考我指针值还是指针地址",再决定输出形式。