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

C语言是否支持Call by reference?C与C++传参机制疑问

C语言和C++的参数传递:值传递 vs 引用传递

你的理解完全正确,下面把关键点拆解清楚:

核心结论

  • C语言只有值传递:不管传递的是int、char这类基本类型,还是指针,函数都会为参数创建本地副本。哪怕传指针,本质也是把指针存储的内存地址复制一份给形参,形参和实参是两个独立的指针变量,只是指向同一块内存而已。
  • C++原生支持真正的引用传递:用&声明的引用是原变量的"别名",没有独立内存空间,对引用的操作直接作用于原变量,这才是标准意义上的Call by reference。

为什么有人误以为C支持传引用?

很多人把C里的指针传递当成了传引用,其实二者本质不同:
比如C里常见的修改原变量的代码:

void change_num(int *p) {
    *p = 20; // 通过指针间接修改原变量的值
}

int main() {
    int num = 10;
    change_num(&num); // 传递num的内存地址
    return 0;
}

这里函数拿到的p是&num的副本——如果在函数里修改p本身(比如p = NULL;),主函数里的&num不会有任何变化。我们只是借助指针的特性间接操作了原变量的内存,本质还是值传递。

而C++的引用传递是直接绑定原变量:

void change_num(int &ref) {
    ref = 20; // 直接修改原变量
}

int main() {
    int num = 10;
    change_num(num); // 直接传递变量,无需取地址
    return 0;
}

这里的ref就是num本身,没有任何副本,对ref的所有操作等价于对num操作,这才是真正的传引用。

一句话总结

C语言没有真正的引用类型,所有参数传递都是值传递;C++的引用传递是语言原生支持的,和指针传递有本质区别。

内容的提问来源于stack exchange,提问作者GT K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:05:21