是通过引用或指针传递的c++数组
Is C++ Array passed by reference or by pointer?
在学校里,老师告诉我们,当我们把数组传递给一个函数时,整个数组都是通过引用传递的。
然而,最近我读了一本书。它表示,在将整个数组传递给函数时,默认情况下数组由指针传递。书中进一步提到"通过指针传递与通过引用传递非常相似",这意味着通过指针传递与通过引用传递实际上是不同的。
似乎不同的来源表述不同。
所以我的问题是:在c++中,当我们将整个数组传递给函数时,数组是通过引用传递还是通过指针传递?
例如:void funcA(int []); //Function Declaration
int main()
{
int array[5];
funcA(array); //Is array passed by ref or by pointer here?
}
在最坏的情况下,你的讲师错了。充其量,他是在简化术语,并在这个过程中混淆你。不幸的是,这在软件教育中是相当普遍的。事实上,很多书在这一点上也犯了错误;数组根本没有被"传递",要么是"通过指针传递",要么是"通过引用传递"。
实际上,由于旧的C限制,数组不能通过值传递,因此将数组作为函数参数时会发生一些特殊的魔力。
函数声明:
void funcA(int[]);
被静默地翻译成以下内容:
void funcA(int*);
和
funcA(myArray);
会被静默地翻译成以下内容:
funcA(&myArray[0]);
的结果是你根本没有传递数组;传递指向其第一个元素的指针。
现在,在某些抽象/简化级别上,你可以称之为"通过指针传递数组","通过引用传递数组"甚至"通过句柄传递数组",但如果你想用c++术语来谈论,这些短语都不准确。
你的讲师使用的术语令人困惑。但是,在函数声明中,例如
void funcA(int []);
int[]
是int*
的另一种说法。所以funcA
可以取任何可以转换成int*
的参数。
数组可以衰变为指向正确上下文中第一个元素的指针。这意味着,例如,您可以像这样将数组的名称分配给指针:
int array[42]; // array is of type int[42]
int * arr = array; // array decays to int*
那么,当你将array
传递给funcA
时,
funcA(array); // array decays to int*
funcA
有一个指向数组第一个元素的指针。
但是也可以通过引用传递数组。它只是需要不同的语法。例如
void funcB(int (&arr)[42]);
因此,在您的示例中,由于您的函数funcA
的签名,您正在传递指向数组的第一个元素的指针。如果你调用funcB(array)
,你将传递一个引用。
指针传递有点用词不当。这在c++中不会发生。只有按值传递和按引用传递。特别是指针是按值传递的。
你的问题的答案是:这取决于。
考虑以下签名:
void foo(int *arr);
void bar(int *&arr);
void baz(int * const &arr);
void quux(int (&arr)[42]);
假设您正在向以下每个函数传递一个数组:
- 在foo(arr)中,数组被衰减为指针,然后按值传递。
- 在bar(arr)中,这是一个编译器错误,因为您的数组将衰减为(临时)指针,并且这将通过引用传递。这几乎总是一个bug,因为您想要可变引用的原因是要更改referent的值,而这不会发生(您将更改临时引用的值)。我添加这一点是因为这实际上在某些启用了特定扩展的编译器(msvc++)上工作。如果你不是手动衰减指针,那么你可以传递它(例如
int *p = arr; bar(p);
) - 在baz(arr)中,数组衰减为一个临时指针,该指针由(const)引用传递。 在quux(arr)中,你的数组是通过引用传递的。
你书上所说的它们相似的意思是,按值传递指针和传递引用通常是相同的实现。区别纯粹是在c++级别上:对于引用,您没有指针的值(因此无法更改它),并且保证它引用的是实际对象(除非您先前破坏了程序)。
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '