c++ 数组形参

数组形参会被弱化为指针,所以处理数组的函数通常通过指向数组中元素的指针来处理数组。

// three equivalent definitions of printValues
void printValues(int *) { /* … */ }
void printValues(int []) { /* … */ }
void printValues(int [10]) { /* … */ }

上面3种定义等价,形参类型都是int *,通常使用第1种。第2种形式虽然看起来更直观,但容易引起误解,因为函数操纵的毕竟不是数组本身,而是指向数组元素的指针。第3种形式的数组长度是被忽略的,这里的10并无实际的约束作用,在printValues内部不应依赖这个数组长度做事情。

和其他类型一样,形参也可以是数组的引用。这时编译器不会将数组实参转换为指针,而是传递数组的引用本身。数组大小成为形参和实参类型的一部分。编译器检查数组实参的大小与形参的大小是否匹配。

// ok: parameter is a reference to an array; size of array is fixed
void printValues(int (&arr)[10]) 
{ 
    for (size_t i = 0; i != 10; ++i)
        cout << arr[i] << endl;
}

int main()
{
    int i = 0, j[2] = {0, 1};
    int k[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

    printValues(&i); // error: argument is not an array of 10 ints
    printValues(j); // error: argument is not an array of 10 ints
    printValues(k); // ok: argument is an array of 10 ints

    return 0;
}

这个版本的printValues只严格接受含有10个ints的数组,所以在printValues函数体内依赖数组大小也是安全的。&arr两边的括号是必须的,否则int &arr[10],会被当做是含有10个引用的数组。

也可以传递多维数组,所谓多维数组实际就是数组的数组。多维数组同样以指向首元素的指针方式传递。除了第一维以外的所有维的长度都必须明确指定。

// first parameter is an array whose elements are arrays of 10 ints
void printValues(int (*matrix)[10], int rowSize);
void printValues(int matrix[][10], int rowSize);

实际上形参还是被弱化为一个指针,只不过它现在所指向的是含有10个ints的数组。

因为非引用型数组形参被弱化为指针,所以无法得知数组的大小,这就容易造成数组越界。一般处理方法有以下三种。

(1)在数组尾端放置一个结束标记,类似于c-style字符串的\0结束符。

(2)传递指向数组的第一个和最后一个元素的下一位置的指针,c++标准库程序采用这种方法。

void printValues(const int *beg, const int *end)
{
    while (beg != end) 
        cout << *beg++ << endl;
}

(3)显示传递表示数组大小的形参

void printValues(const int ia[], size_t size)
{
    for (size_t i = 0; i != size; ++i)
        cout << ia[i] << endl;
}

【学习资料】 《c++ primer》
原文链接: https://www.cnblogs.com/zhuyf87/archive/2013/02/03/2890927.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/77503

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午6:00
下一篇 2023年2月9日 下午6:00

相关推荐