返回指向数组的指针或使用参数使 void 函数

Return pointer to array or make void function with parameter

本文关键字:参数 void 函数 指针 数组 返回      更新时间:2023-10-16

到目前为止,大多数时候我都在使用返回数组指针的函数,但现在我开始使用引用数组的 void 函数,所以我想知道下面的代码中的哪一个更好使用,为什么?

void doSomething(int** &ary)
{
    ary = new int*[3];
    for (int i = 0; i < 3; ++i)
        ary[i] = new int[3];
    ary[0][0] = 1;
    ary[0][1] = 2;
}
int** ary=NULL;
doSomething(ary);

或者这个

int** doSomething1()
{
    int **ary = new int*[3];
    for (int i = 0; i < 3; ++i)
        ary[i] = new int[3];
    ary[0][0] = 1;
    ary[0][1] = 2;
    return ary;
}
int **ary1=doSomething1();

这是一个意见问题,但是,这是我的:

我认为返回指针的版本更好。为什么?仅仅因为它使调用站点不那么神奇。使用 return 变体,您可以像这样调用函数:

int** my2dArray = doSomething();

很明显,my2dArray被初始化为指向函数提供的某个数组。无需查看函数定义。

另一方面,电话

int** my2dArray;
doSomething(my2dArray);

应该始终为读者敲响警钟:看起来好像您正在将未初始化的指针传递给函数。即使在查找函数定义并看到指针是通过引用传递的之后,读者仍然无法确定函数不会解释传入的值。它需要仔细查看代码以确保此调用确实是合法的。

因此,为了可调试性,我避免传递引用参数。我按值传递,按const引用传递(与按值传递具有相同的语义),或者通过显式指针传递。这样,任何函数调用都不能修改在调用站点上不显式可见的值。

这两个例子之间没有太大区别,但我更喜欢第二个例子。

在第一个示例中,您引用了 ary ,这意味着您的程序每次访问 ary 中某处的元素时都必须取消引用所有指针。(引用等效于代码编译后的指针)

在第二个示例中,您只需在函数返回时复制指针。

第一个例子:

引用指向数组的指针 ->指向数组的指针 ->数组中的元素

第二个例子:

指向数组的指针 -数组中的>元素