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

