返回指向数组的指针或使用参数使 void 函数
Return pointer to array or make void function with parameter
到目前为止,大多数时候我都在使用返回数组指针的函数,但现在我开始使用引用数组的 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
中某处的元素时都必须取消引用所有指针。(引用等效于代码编译后的指针)
在第二个示例中,您只需在函数返回时复制指针。
第一个例子:
引用指向数组的指针 ->指向数组的指针 ->数组中的元素
第二个例子:
指向数组的指针 -数组中的>元素
相关文章:
- 在派生函数中指定void*参数
- void 函数可以传递值参数吗?
- 如何在C++中使用 Void 而不会收到有关参数的错误
- std::function<void()> 接受参数
- C++ 类型的参数与 void (__cdecl*)(void) 类型的参数不兼容,当调用 std::atexit()
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 将可变参数模板类型转换为 void,预期')'之前
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- 如何成功地将函数对象(或lambda)传递给trackbar回调的第二个参数(void*)
- 带有void类型和参数的C++11模板专用化
- 如何将变量的值安全地传递给C++方法,该方法只将void*作为参数
- void 函数中的指针参数返回不一致的值
- 如何将 std::string 作为构造函数参数传递,并将其保存的 C 字符串存储在 void 指针中?
- C++ void 作为参数,如 PHP
- sqlite3 更改函数回调参数 void* not用于 int* C++
- C PIMPL成语,类模板和void模板参数
- 无法将参数 1 从"int (__thiscall A::* *)(void)"转换为"int (__cdecl *)(void)"
- 如何警告 C 中 void 指针上的参数不兼容的类型
- 非类型模板参数可以是 "void*" 类型吗?
- 有人能解释参数void(*pfn)(void*)吗