设为首页 加入收藏

TOP

14.5 数组总是按地址进行传递
2013-10-07 15:04:59 来源: 作者: 【 】 浏览:76
Tags:14.5 总是 地址 进行 传递

14.5  数组总是按地址进行传递

正如[Lind1994]中详细描述的那样,在C里面,非数组类型的变量是按值传递给函数的,而数组类型的变量则是按地址传递的。在C++(www.cppentry.com)中这个规则同样适用,不过在C++(www.cppentry.com)中,人们可以通过为函数形参添加一个取址运算符"&"而使非数组变量按引用传递。在C和C++(www.cppentry.com)中均不存在内建的按值传递数组的机制。

  1. int i;  
  2. int ar[10];  
  3.  
  4. void f(int x, int y[10])  
  5. {  
  6.   xx = x + 1;         // i未受影响  
  7.   y[0] = y[0] + 1;  // ar受到影响  
  8. }  
  9.  
  10. f(i, ar);  

然而,按值传递数组的需求很少,所以这算不上什么缺陷。不过,有时按值传递数组的需要还是存在的,幸运的是这太容易实现了。结构(联合,以及C++(www.cppentry.com)中的类)的内容是按值拷贝的,所以你可以简单地定义一个结构,让它包含欲按值传递的数组,并将该结构的实例作为函数的参数来传递,即可达到目的。
  1. int i;  
  2. struct int10  
  3. {  
  4.   int values[10];  
  5. }   ar;  
  6.  
  7. void (int x, int10 y)  
  8. {  
  9.   xx = x + 1;                        // i未受影响  
  10.   y.values[0] = y. values [0] + 1;  // ar也未受影响  
  11. }  
  12.  
  13. f(i, ar);  

当然,在C++(www.cppentry.com)中你可以从类型和大小方面对其进行泛化,类模板如下:
  1. template <typename T, size_t N> 
  2. struct array_copy  
  3. {  
  4.   T values[N];  
  5. };  

就这么简单。C++(www.cppentry.com)编译器会根据T是否支持缺省构造(2.2.2小节)、析构(2.2.8小节)、拷贝构造(2.2.3小节)和拷贝赋值操作(2.2.4小节)来决定是否为array_copy类生成相应的这些函数。 当然,此类可拷贝的数组的大小在编译期是固定的。如果你想要一个可变大小的可拷贝数组,std::vector是你的最佳选择(见14.6.4小节)。
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇14.2.1 下标索引操作符的交换性 下一篇14.4 无法将数组传递给函数

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: