分类: C/C++
2009-05-15 15:26:38
上述三种定义方式等价,形参类型皆为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);