有三种常见的编程技巧确保函数的操作不超出数组实参的边界。
第一种方法:放置标记
在数组本身放置一个标记来检测数组的结束。C 风格字符串就是采用这种方法的一个例子,它是一种字符数组,并且以空字符 null 作为结束的标记。处理 C风格字符串的程序就是使用这个标记停止数组元素的处理。
第二种方法: 使用标准库规范
是传递指向数组第一个和最后一个元素的下一个位置的指针。这种编程风格由标准库所使用的技术启发而得
使用这种方法重写函数fun并调用该函数,如下所示:
void fun(const int *beg, const int *end)
{
while (beg != end)
{
cout << *beg++ << endl;
}
}
int main()
{
int j[2] = {0, 1};
printValues(j, j + 2);
return 0;
}
每次循环都使beg 指针指向下一个元素,从而实现数组的遍历。当 beg 指针等于结束标记时,循环结束。结束标记就是传递给函数的第二个形参。调用这个版本的函数需要传递两个指针:一个指向要输出的第一个元素,另一个则指向最后一个元素的下一个位置。只要正确计算指针,使它们标记一段有效的元素范围,程序就会安全。
显式传递表示数组大小的形参
第三种方法:将第二个形参定义为表示数组的大小
这种用法在 C 程序和标准化之前的 C++ 程序中十分普遍。用这种方法再次重写函数 fun,新版本及其调用如下所示:
void fun(const int ia[], size_t size)
{
for (size_t i = 0; i != size; ++i)
{
cout << ia[i] << endl;
}
}
int main()
{
int j[] = { 0, 1 };
fun(j, sizeof(j));
return 0;
}