You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++:为何string应按引用传递,char数组却不宜用&传引用?

关于C++中char数组与std::string传参的疑惑解答

嘿,这个问题问得特别到位,刚接触C++的时候几乎都会在数组和string的传参上绕弯,我来给你理清楚这里的核心区别~

首先得纠正你一个小误解:char数组和std::string的参数本质并不完全是一回事,虽然数组传参会退化为指针,但std::string是一个完整的类类型,这是两者传参逻辑不同的根源。

先聊char数组的传参

当你把char mychar[10]传给changeChar(char* buffer, int bSize)时,数组名mychar会被隐式转换成指向数组首元素的char*指针。这时候你通过strcpy_s修改buffer指向的内存,其实直接操作的就是原数组的内存空间——所以哪怕不用引用,你修改的效果也会直接反映到原数组上。

那为什么不能直接用&传递char数组的引用?其实不是完全不行,你可以这么写:

void changeChar(char (&buffer)[10]) {
    strcpy_s(buffer, sizeof(buffer), "test123");
}

但这种写法的问题在于,函数只能接收固定大小为10的char数组,灵活性极差,没法处理不同长度的数组。所以实际开发中,大家更倾向于用「指针+长度」的方式,既能修改原数组,又能适配不同大小的数组。

再看std::string的传参

你的示例里用了changeString(string* buffer)通过指针修改string,但更推荐的写法是用引用:

void changeString(string& buffer) {
    buffer = "test321";
}

这是因为std::string是一个封装了字符数据的类,它内部确实有指针指向存储字符的内存,但string本身是一个包含了指针、长度、容量等成员的完整对象。如果你传值(比如void changeString(string buffer)),会触发整个string对象的拷贝,不仅效率低,而且你修改的只是拷贝出来的临时对象,原mystr根本不会变。

而传引用(或指针)的话,是直接操作原对象,既没有拷贝开销,又能真正修改原string的内容。相比指针,引用的语法更简洁,还能避免空指针的风险(只要你保证引用的是一个有效的string对象),所以是更优的选择。

结合你的代码对比总结

  • 对于char mychar[10]:传数组名时会退化为指针,修改指针指向的内存就是修改原数组,所以不需要引用也能生效;
  • 对于string mystr:传值会拷贝对象,要修改原对象必须用引用或指针,引用是更推荐的方式;
  • 核心区别:char数组是原生的连续内存块,而std::string是封装了内存管理的类类型,不是单纯的指针。

内容的提问来源于stack exchange,提问作者Johnny Code

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:27:57