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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:39:38