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

C++中数组是否为引用?函数参数传递相关疑问

关于C++数组与指针、引用的困惑解答

先把你的代码和输出整理成更清晰的格式:

#include <iostream>
using namespace std;

void printArray(int arr[]) { 
    cout << arr[0] << arr[1] << arr[2] << endl; 
} 

int main() { 
    int arr[3] = {5, 7, 9}; 
    int *aPtr = &arr[0]; 
    cout << aPtr[0] << aPtr[1] << aPtr[2] << endl; 
    int *bPtr = arr; 
    cout << bPtr[0] << bPtr[1] << bPtr[2] << endl; 
    printArray(arr); 
}

输出:

579
579
579

接下来逐个解答你的问题:

问题1:C++中的数组是引用吗?我能否表述为i = &i[0]?

首先明确:数组不是引用。数组是一块连续的内存空间,用来存储相同类型的元素,它有自己独立的内存地址和存储空间。

你看到int *bPtr = arr;能正常工作,是因为C++有个特殊规则:当数组名作为表达式使用时(除了sizeof(arr)、&arr这类少数例外),它会自动隐式转换为指向数组第一个元素的指针——也就是arr等价于&arr[0],但这是语言的转换规则,不是因为数组是引用。

另外,你不能写i = &i[0](假设i是数组名),因为数组名是不可修改的左值,它相当于一个常量指针,无法被赋值。比如int arr[3]; arr = &arr[0];会直接编译报错,编译器会提示你“数组名不能作为左值赋值”。

问题2:如果第一题的答案是肯定的,是否因为数组是引用,所以printArray函数的参数不需要使用&,即无需声明为printArray(int &arr[])?

首先第一题答案是否定的,不过我们来解释为什么函数参数不需要&:

当你把数组传递给函数时,数组名已经隐式转换成了指向第一个元素的指针,所以函数参数里的int arr[]其实是int* arr的语法糖——编译器会自动把它当成指针处理。这时候传递的是指针的值(也就是数组第一个元素的地址),函数内部操作的是这个指针指向的内存,所以不需要额外加&传引用。

另外,int &arr[]这种写法是非法的,C++不允许直接这么声明数组引用参数。如果你想真正传递数组的引用(而非指针),正确写法是:

void printArray(int (&arr)[3]) { 
    cout << arr[0] << arr[1] << arr[2] << endl; 
}

这种写法的好处是编译器会检查传入的参数是否是长度为3的int数组,避免传递长度不匹配的数组,而原来的int arr[]写法不会做这个检查。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:24:46