14.5 数组总是按地址进行传递
正如[Lind1994]中详细描述的那样,在C里面,非数组类型的变量是按值传递给函数的,而数组类型的变量则是按地址传递的。在C++(www.cppentry.com)中这个规则同样适用,不过在C++(www.cppentry.com)中,人们可以通过为函数形参添加一个取址运算符"&"而使非数组变量按引用传递。在C和C++(www.cppentry.com)中均不存在内建的按值传递数组的机制。
- int i;
- int ar[10];
-
- void f(int x, int y[10])
- {
- xx = x + 1; // i未受影响
- y[0] = y[0] + 1; // ar受到影响
- }
-
- f(i, ar);
然而,按值传递数组的需求很少,所以这算不上什么缺陷。不过,有时按值传递数组的需要还是存在的,幸运的是这太容易实现了。结构(联合,以及C++(www.cppentry.com)中的类)的内容是按值拷贝的,所以你可以简单地定义一个结构,让它包含欲按值传递的数组,并将该结构的实例作为函数的参数来传递,即可达到目的。- int i;
- struct int10
- {
- int values[10];
- } ar;
-
- void (int x, int10 y)
- {
- xx = x + 1; // i未受影响
- y.values[0] = y. values [0] + 1; // ar也未受影响
- }
-
- f(i, ar);
当然,在C++(www.cppentry.com)中你可以从类型和大小方面对其进行泛化,类模板如下:- template <typename T, size_t N>
- struct array_copy
- {
- T values[N];
- };
就这么简单。C++(www.cppentry.com)编译器会根据T是否支持缺省构造(2.2.2小节)、析构(2.2.8小节)、拷贝构造(2.2.3小节)和拷贝赋值操作(2.2.4小节)来决定是否为array_copy类生成相应的这些函数。 当然,此类可拷贝的数组的大小在编译期是固定的。如果你想要一个可变大小的可拷贝数组,std::vector是你的最佳选择(见14.6.4小节)。