C++数组作为函数参数默认按引用传递吗?相关困惑咨询
嘿,完全懂你的困惑!这个点绝对是C语言入门里最容易绕晕人的坑之一,好多刚学的朋友都在这儿卡过,咱们慢慢把它掰明白~
先敲黑板:C语言里根本没有“引用传递”这回事!
首先得明确一个核心事实:C语言本身不支持引用传递——那些说“数组按引用传递”的资料,其实是从「效果」出发的简化说法,本质和真正的引用(比如C++里的引用)完全不是一回事。
数组传递时的真实操作:退化为指针
当你把数组(比如int arr[10])传给函数的时候,实际发生的是:
- 数组名会自动转换成指向数组第一个元素的指针,也就是
&arr[0] - 函数的参数不管写成
void toBin(int *arr)还是void toBin(int arr[]),编译器都会把它当成指针来处理——这两种写法是完全等价的 - 函数里拿到的
arr是一个指针副本,但它指向的是原数组在内存里的地址,所以通过它修改元素时,会直接改动原数组的内容
为什么两种说法会混在一起?
- 说「按引用传递」的人,是看最终效果:修改函数里的数组元素,原数组也跟着变,看起来像是把数组本身传进去了
- 说「退化为指针」的人,是看底层实现:你可以试试在函数内部和外部分别打印
sizeof(arr)——外部是整个数组的大小,内部却是指针的大小(4或8字节,取决于系统),这就是最直接的证明
用代码例子帮你直观理解
假设你的代码是这样的:
#include <stdio.h> void toBin(int arr[]) { // 这里的arr是指针,sizeof(arr)输出4或8 arr[0] = 1; // 这步修改的是原数组的第一个元素 } int main() { int nums[5] = {0,0,0,0,0}; toBin(nums); printf("%d", nums[0]); // 输出1,原数组确实被改了 // 这里sizeof(nums)是5*4=20(假设int占4字节) return 0; }
你看,函数toBin拿到的是指针,但因为指针指向原数组的内存,所以修改操作会作用在原数组上——这就是为什么有人会误以为是「引用传递」,但本质上还是值传递,只是传递的是指针的值(也就是内存地址)而已。
最后给你划重点
- 数组传给函数时,必然会退化为指针,函数接收的是指向数组首元素的指针副本
- 「按引用传递」只是效果上的通俗说法,C语言本身没有引用类型(C++才有)
- 这种传递方式的好处是不用拷贝整个大数组,效率高;但要注意,函数内部没法直接获取原数组的长度,必须额外传一个长度参数
内容的提问来源于stack exchange,提问作者I Like
相关产品推荐
相关产品推荐

