下列 C++ 代码的输出是( )。
#include <iostream>
using namespace std;
int main() {
int arr[5] = {2, 4, 6, 8, 10};
int * p = arr + 2;
cout << p[3] << endl;
return 0;
}仔细审题,明确已知条件和所求目标,运用相关知识点逐项分析。
审题时注意题目要求(选正确还是选错误),避免因审题不清失分。涉及代码的题目要逐行分析变量变化。
【考点】指针算术运算|数组越界访问|C++指针与内存模型
🎯 考纲定位 GESP 202506 C++ 七级"指针与数组"模块。命题人专挖"指针算术合法但越界访问非法"的认知盲区:多数学生以为arr+5就是"空指针",实则它只是地址偏移,真正陷阱在*(arr+5)这一行——这是七级高频考点,卡在"指针合法≠访问合法"的混淆上。
🧠 解题思维 看到p = arr + 2先定位初始地址,再看p[3]即*(p+3),计算得*(arr+5)。C++允许指针算术超出数组范围,但*(arr+5)属于未定义行为——输出结果完全取决于运行时内存布局,无法保证。
🪤 陷阱拆解 A项把p当arr用:p[3]是arr+5而非arr+3;B项误以为p[3]等于原数组第4位;C项最离谱——arr+5是合法指针(指向数组之后内存),编译只会报错,不会报"非法指针"。
🔄 反命题思维 若改为int arr[10],p[3]即arr[5]输出6;若改成int *p = arr + 3,则p[3]输出arr[6]。这类题本质考"指针算术与数组越界的边界",不是考"数组大小是否匹配"。