我被给予了一段使用(C++)编写的代码,其中通过数组传递参数。
void fun(int *& name){...}
但是这背后的意义是什么呢?我猜它的意思是“引用数组”,但如果你只传递指向第一个元素的指针,那应该也没问题吧?所以采用这种方式的动机是什么呢?
name
指向的int
,还可以在函数调用中对指针本身进行更改,并且这些更改也将在外部可见。#include <iostream>
int* allocate()
{
return new int();
}
void destroy(int*& ptr)
{
delete ptr;
ptr = NULL;
}
int
main(int argc, char *argv[])
{
int* foo = allocate();
std::cout << foo << std::endl;
destroy(foo);
std::cout << foo << std::endl;
return 0;
}
输出结果为:
0x82dc008
0
这意味着该函数可以修改调用者中指针的值。
例如:
myName* foo; /* ToDo - initialise foo in some way*/
fun(foo);
/* foo might now point to something else*/
我认为这是一种反模式。原因在于阅读你的代码的人不会预料到 foo
会被修改,因为调用语法与更常规的函数 void anotherFun(int * name){...}
无法区分。
这样的代码稳定性可能会受到影响。因此,我建议您使用 void fun(int ** name){...}
。调用语法变成了 fun(&foo)
,这告诉函数用户 foo
可能会被修改。
int* fun(int* name);
,并返回新值。 - juanchopanzaint**
的替代方案是使用清晰且有良好文档说明的API,并为函数选择合适的名称,例如deleteAndSetNull(int*& ptr)
,用于删除指针并将其设置为NULL。 - oxygeneint* fun(int* name)
的建议。我不喜欢OP所使用的引用方式,因为它们使代码难以阅读,并且初学者在协作项目中可能会引入错误。如果可能的话,请至少使用const &
。 - Bathshebafoo
不被修改,您可以使用 fun(myName *const &name)
。 - PaperBirdMaster
int a[10]
数组传递给此函数。 - AnT stands with Russia