C ++编译器通过引用传递而没有告诉我吗?

时间:2018-09-21 19:18:29

标签: c++ arrays pointers

因此,我在今年早些时候编写了一个程序,该程序教会了我们如何使用数组。就在最近,我被教导有关在C ++中使用指针和结构的知识。现在,我已经有了这些知识和理解(或者我认为是这样),我对我以前的程序如何工作感到困惑!

在我说更多之前,这是程序代码:

https://pastebin.com/AYyv2Bzt

特别注意我的askSales函数,因为这让我感到困惑

void askSales(int salesArray[], string namesArray[])
{
for (int counter = 0; counter <= NUM_OF_POS; counter++)
  {
      cout << "How many jars of " << namesArray[counter] << "sold? : ";
      cin >> salesArray[counter];

      while (salesArray[counter] < 0 )
            {
            cout << endl << "You cannot enter a negative number for sales. If no jars were\nsold please enter 0. Please answer prompt again."
                 << endl << endl
                 << "How many jars of " << namesArray[counter] << "sold? : ";
            cin >> salesArray[counter];
            }
   }
}

在这里,我很困惑:

当这些参数没有通过引用传递时,我的程序如何修改传递给askSales的数组的内容?

2 个答案:

答案 0 :(得分:3)

普通C ++数组永远​​不会单独通过值传递。他们衰变变成指针。

在函数的声明/定义中,语法T id[](甚至带有数字,例如T id[4])只是T *id的语法糖。完全一样。

将数组传递给函数时,会将其隐式转换(“衰减”)为指向其第一个元素的指针。


请注意,以上内容仅适用于纯数组。在现代C ++中,您可以选择使用std::array<T, n>声明类型为n的{​​{1}}个对象的数组。由于T是类,因此其行为类似于类,并且没有任何此类衰减规则。这样的数组实际上是在通过valaue传递时复制的。

答案 1 :(得分:3)

在函数声明及其调用中,您得到array-to-pointer decay

这意味着您的功能完全与此相同:

void askSales(int* salesArray, string* namesArray)

这显然不会按值传递数组并创建该数组的新副本,而是传递指向原始数组的指针。给出按引用传递的效果(因为指针指向函数外部的原始数组)。