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
相关产品推荐
相关产品推荐

