C++ 是C++;数组是通过引用还是指针传递?

C++ 是C++;数组是通过引用还是指针传递?,c++,arrays,function,pointers,reference,C++,Arrays,Function,Pointers,Reference,在学校,我们的讲师告诉我们,当我们将整个数组传递给函数时,它是通过引用传递的 然而,最近我读了一本书。它表示在将整个数组传递给函数时,默认情况下数组由指针传递。书中进一步提到“通过指针传递与通过引用传递非常相似”,这意味着通过指针传递和通过引用传递实际上是不同的 看来不同的来源陈述的方式不同 我的问题是:< /St>在C++中,当我们通过整个数组< />到函数> 时,数组是通过引用还是指针传递的? 例如: void funcA(int []); //Function Declaration i

在学校,我们的讲师告诉我们,当我们将整个数组传递给函数时,它是通过引用传递的

然而,最近我读了一本书。它表示在将整个数组传递给函数时,默认情况下数组由指针传递。书中进一步提到“通过指针传递与通过引用传递非常相似”,这意味着通过指针传递和通过引用传递实际上是不同的

看来不同的来源陈述的方式不同

我的问题是:< /St>在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[0]);
当你写这封信的时候:

funcA(myArray);
它以静默方式转换为以下内容:

void funcA(int*);
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++级别上的:用引用,你没有指针的值(因此不能改变它),它保证引用一个实际对象(除非你早破了程序)。数组是数组是数组。数组不是指针。@Melkon:不,不是。这是一个数组。数组到指针的衰减只发生在某些非常明确的情况下。@Melkon:如果数组是指向第一个元素的指针,那么其他元素都在哪里?(动词对我来说有意义…)。数组是“相同元素的压缩序列”。当作为参数传递时,会衰减为指针。您可以使用指针算法访问数组元素(a[5]只不过是*(a+5)),这一事实并不会使指针成为数组。它们位于内存中不同的位置。@fredfoverflow:从内存的角度来看,函数参数是局部变量。。。如果没有“存储”在某个有名称的东西中,它将作为“临时对象”留在某种程度上的“临时内存”中,该内存可以是堆栈本身或CPU寄存器。但“记忆”总是很重要的。否则你就不能使用它的价值(因此你不能取消引用它)@Mehrdad:在问讲师或书是否错的问题上,它绝对“增加了一些东西”来分析讲师和书的陈述。请不要删除我答案中的关键部分。