因此,我在今年早些时候编写了一个程序,该程序教会了我们如何使用数组。就在最近,我被教导有关在C ++中使用指针和结构的知识。现在,我已经有了这些知识和理解(或者我认为是这样),我对我以前的程序如何工作感到困惑!
在我说更多之前,这是程序代码:
特别注意我的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的数组的内容?
答案 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)
这显然不会按值传递数组并创建该数组的新副本,而是传递指向原始数组的指针。给出按引用传递的效果(因为指针指向函数外部的原始数组)。