Chinaunix首页 | 论坛 | 博客
  • 博客访问: 220710
  • 博文数量: 56
  • 博客积分: 2325
  • 博客等级: 大尉
  • 技术积分: 560
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-30 18:18
文章存档

2012年(7)

2011年(1)

2010年(2)

2009年(46)

我的朋友

分类: C/C++

2009-05-15 15:26:38

1.数组形参的定义方式
 
  func(int *a);
  func(int a[]);
  func(int a[10]);

    上述三种定义方式等价,形参类型皆为int *; 第三种方式容易引起误解,因为编译器检查数组形参关联的实参时,只检查其是不是指针、指向的类型是否和数组元素匹配,而不检查数组的长度。

 如:

func(int a[10]){

a[9] = 10;

}

int a[2];

func(a); //调用正确,但函数执行出了问题

 

2.数组形参和引用

    数组形参定义为非引用时:传递的数组实参转换为指针,如上所述;

    数组形参定义为引用时:编译器不会将数组转换为指针,而是传递数组的引用本身。如:

    func( int (&a)[10]){

    a[9] = 10;

    }

    是合法的。因为编译器会检查数组实参的大小是否和形参的大小匹配。

3.多维数组形参

     func(int (*matrix)[10]);

     func(int matrix[][10]);

     同样,编译器忽略第一维的长度,最好不要包含。

4.传递给函数的数组的处理

     第一重要原则:对数组的处理要确保停留在数组的边界内。

     三种处理技巧:

     第一种:在数组本身放置一个标记来检测数组的结束。c风格字符串的处理。其实是字符数组,数组的最后一个元素为null符。处理时,遇到null就停止。

     第二种:传递指向数组的第一个和最后一个元素的指针。这种风格有标准库所使用的技术启发。

     func(const int *beg, const int *end);

     第三种:传递数组的大小。在c和标准化之前的c++中十分普遍。

     func(const int a[], size_t size);

   


 

阅读(4030) | 评论(0) | 转发(1) |
0

上一篇:suid和sgid详解

下一篇:c++中的友元

给主人留下些什么吧!~~