使用如下代码片段定义四个字符串(假设头文件已正确定义),以下说法错误的是( )。
string str1 = "abc";
string str2 = str1;
char str3[] = "abc";
char * str4 = str3;这题考的是C++里string类和char数组的底层区别,特别是赋值时的拷贝与引用。拿到题先盯着类型:str1是string对象,str2是它的副本,str3是定长字符数组,str4是指向str3的指针。只要分清‘类对象赋值是拷贝内存’而‘指针赋值是共享地址’,C选项那个‘指向同一块内存’的说法就露馅了。
最容易掉进坑里的是把string和char*混为一谈,以为所有赋值都像指针那样共享内存,或者把str3的4字节当成str1的容量,忽略string内部动态管理的开销。还有人会纠结str4和str3是不是‘修改后互相影响’,其实str4只是取了str3的地址,C选项错就错在把string str2说成和str1同址,这是典型的类型概念混淆。
【考点】std::string与C风格字符串的内存模型|赋值语义(拷贝vs引用)|指针与数组的关系
这条题在GESP五级里属于高频陷阱,命题人专门盯着考生对‘string类’和‘char数组’底层行为的混淆。很多人背过‘cout都能输出’,却分不清赋值时是拷贝一份还是共享一块内存,导致C选项被大量误选。
先拆解四个变量的本质:
逐项核对选项: A选项说四个都能cout输出。正确。string重载了<<,char数组会自动转为C字符串,char*也是地址,都能正确输出内容。 B选项说str3只占4字节,str1占更多。正确。str3是定长4字节,str1作为string对象至少包含长度字段、容量字段和实际数据,通常远超4字节。 C选项声称str2和str1指向同一块内存,修改str1会影响str2。错误!string的赋值语义是拷贝,str2有独立堆内存,两者互不影响。命题人就是在这里挖坑:用‘直接赋值’偷换概念,诱导考生套用指针的共享规则。 D选项说str4和str3指向同一内存,修改str3会影响str4。正确。str4只是取了str3的地址,两者共享同一块栈内存,改str3[0]自然也会改str4[0]。
思考心法:拿到这类题先分两类对象——类对象(string)和原始内存块(char数组/指针)。类对象赋值默认拷贝,原始指针/数组赋值默认共享地址。再结合内存占用:char[]定长,string动态。最后用‘反命题思维’验证:如果把C改成string& str2 = str1,那就变成引用,C就对了;如果把D改成string str4 = string(str3),那str4就是独立拷贝,D就错了。刷到类似题先问自己:这赋值操作针对的是类对象还是原始指针?是拷贝还是引用?
避坑提醒:千万别把string当指针用,也别把char*当数组用。str3的4字节是数组大小,str1的内存远不止这个数;str4和str3共享地址,但str2和str1各自独立。题目问‘错误的是’,答案就是C。
考频与趋势:字符串相关考点在题库共考过99题,覆盖10个考试级别,近年热度极高——2025年32题、2026年19题、2024年10题,呈现逐年攀升态势。分赛事看,GESP五级19题、六级17题、NOIP普及组初赛14题、GESP三级14题,说明五级考生必须吃透string与char数组的区别。字符数组与字符串处理单独统计107题,其中CSP入门级37题、GESP五级19题,两者交叉考查频率很高。二叉树相关考点虽然总数多(220题),但与此题无关,不过提醒我们五级C++组常把基础语法与数据结构穿插出题。
预测:基于2025年32题、2026年19题的爆发式增长,以及GESP五级19题的持续高频,未来两年GESP五级C++组几乎必考‘string与char数组的内存行为对比’类题目,命题角度可能从‘输出’转向‘修改影响范围’或‘内存占用计算’,甚至结合指针运算(如str4++)考地址变化。暂无足够依据预测具体年份的精确题量,但趋势明确:这类基础概念辨析题只会越来越细、越来越灵活。