下面 C++ 代码执行后输出是( )。
int main()
{
char *p = "I love GESP!";
cout << p + 5 << endl;
cout << endl;
return 0;
}答案C。指针和数组的代码追踪:画出变量和指针的内存示意图,追踪每次赋值后值的变化。
指针和数组追踪时画内存布局图可以大大简化理解。
【考点】指针运算|字符串输出|C++流操作
🎯 考纲定位 GESP 202403 C++ 四级,考查指针运算与字符串输出。命题人卡住的是考生对 cout << char* 输出机制的误解——以为指针加法会跳过字符,却忘了输出是从当前指针位置到字符串末尾。
🧠 解题思维 看到指针定义先定位起始位置,p 指向"I love GESP!"首字符'I'。p + 5 表示向后偏移 5 个位置,即指向第 6 个字符'e'(索引从 0 开始)。cout << p + 5 输出从'e'开始到字符串末尾的完整子串,包含空格和感叹号。通法是:指针加 n 即指向第 n+1 个字符,输出时永远从该位置到字符串结束。
🪤 陷阱拆解 选项 A 只输出了'e',忽略了 cout 遇到字符串末尾自动终止的特性。选项 B 误以为 p+5 指向第 5 个字符(实际是第 6 个),还删掉了空格。选项 D 完全没看到'e',是把指针加成了 p+7。题目最阴险处在于空格和感叹号——很多考生只盯着字母,却忘了字符串里有非字母字符,导致选项 C 里空格和!都被正确输出。
🔄 反命题思维 如果把 p+5 改为 p+7,答案就是"D. GESP!";若改成 cout << p + 5 - p,那输出的是整数"5";甚至改成字符串 s.substr(5) 也能得到同样结果。刷到这类题先问:指针加 n 到底指向哪个字符?cout 遇到 char* 会输出到哪儿?