下面 C++ 代码将输出 $1$。()
int list[10]={1};
cout<<list<<endl;这题考的是数组名在输出流中的特殊行为。拿到题先别急着看数组里存了什么,要反应过来 cout 输出数组名时输的是地址不是值。
很多学生会下意识认为 cout 会输出数组元素,或者把数组名当成普通变量去取值,忽略了数组名在表达式中退化为指针的本质。
【考点定位】这道题属于 GESP 三级《C++ 基础》中数组与指针的范畴,同时也涉及输出流的行为规则。命题人特意选了这个点,就是想看学生是否真正理解“数组名在表达式中代表首元素地址”这一核心概念,以及 cout 对指针的默认处理逻辑。
【知识拆解】首先,数组 int list[10]={1}; 的定义很明确:声明了一个长度为 10 的整型数组,并用列表初始化,只有第一个元素 list[0] 被赋值为 1,其余元素自动初始化为 0。这里的关键在于,数组名 list 本身并不是一个变量,它代表的是数组首元素的内存地址(即 &list[0])。在绝大多数表达式中,数组名都会自动退化为这个地址。
【命题视角】命题人挖坑的地方非常隐蔽:代码里明明初始化了数据,还专门在数组第一个元素放了个 1,很容易让学生产生“这题肯定跟这个 1 有关”的错觉。但 cout<<list 这一行,根本没有用到 list[0] 的值,而是直接输出了 list 这个符号代表的地址。这考察的是对“数组名=指针”这一底层机制的直觉,以及对 cout 流操作符重载的理解——当 cout 遇到指针时,它会调用指针的流输出重载,打印出内存地址的十六进制表示,而不是指针指向的内容。
【思考心法】遇到这类题,拿到代码先不急着代入数值,而是先看 cout 后面跟的是什么。如果是变量名,想它存的是值;如果是数组名,立刻反应“这是地址”;如果是指针变量,也是地址。然后想 cout 对这个东西做了什么:如果是值,直接打印;如果是地址,打印十六进制。这样就能避开被数组里存的数据干扰的陷阱。
【逐行推演】回到本题:int list[10]={1}; 定义完毕,list 指向地址 0x...(具体地址取决于运行环境)。cout<<list 执行时,cout 看到的是地址,于是输出类似 0x7ffd... 这样的十六进制数。哪怕这个地址碰巧等于 1(在 32 位系统中地址从 1 开始),cout 输出的依然是地址格式,不会是纯数字 1。所以题目说“输出 1”是错误的。
【避坑提醒】学生最容易错在两个地方:一是混淆数组名和数组元素,以为 cout 会输出 list[0] 的值;二是被初始化语法迷惑,觉得{1}意味着整个数组都是 1。其实{1}只初始化第一个元素,其余全是 0。命题人就是利用这种表面上的“有值”来诱导学生选 A。
【考频与趋势】根据题库数据,基础语法类题目在 GESP 三级中占比很高,2023 年考了 287 题,2024 年 413 题,2025 年 401 题,2026 年 109 题,整体保持高频。其中数组与指针相关的考点在三级中出现频率稳定,属于必考基础。控制结构和循环结构虽然也高频,但本题明显属于基础语法范畴,命题人倾向于在基础题中埋设这类概念性陷阱,以区分真正掌握语言细节的学生。
【预测】基于近年考情,未来 GESP 三级仍会持续考察数组名与指针的等价关系,可能会以类似形式出现,比如 cout<<arr 或 cout<<&arr 的对比,或者结合函数传参考察数组退化。暂无足够依据预测具体变化,但这类概念题大概率会保持高频出现。