为什么将数组作为“int *& name”传递?

6

我被给予了一段使用(C++)编写的代码,其中通过数组传递参数。

void fun(int *& name){...}

但是这背后的意义是什么呢?我猜它的意思是“引用数组”,但如果你只传递指向第一个元素的指针,那应该也没问题吧?所以采用这种方式的动机是什么呢?


3
这句话的意思是指针变量的引用。它的目的是改变传递给它的指针变量。 - πάντα ῥεῖ
3
数组?无法通过这种参数传递实际的数组对象。您可以传递一个指向某个数组元素的指针,但不能传递数组本身。例如,您无法直接将 int a[10] 数组传递给此函数。 - AnT stands with Russia
重要的是要知道,数组不是指针,指针也不是数组。有关此问题,请参见此帖子 - juanchopanza
2个回答

5
该函数接收一个指针的引用。这意味着该函数不仅可以修改被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

2

这意味着该函数可以修改调用者中指针的值。

例如:

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 可能会被修改。


1
我认为在可以使用引用的情况下使用指针是一种反模式。但我也会做一些不同的事情:int* fun(int* name);,并返回新值。 - juanchopanza
嗯,就我个人而言,我不喜欢在不必要的情况下使用指向指针的语法。所以这取决于个人偏好。然而,我同意一般来说调用者可能会意外发现指针被修改了。你提出的int**的替代方案是使用清晰且有良好文档说明的API,并为函数选择合适的名称,例如deleteAndSetNull(int*& ptr),用于删除指针并将其设置为NULL。 - oxygene
这真是有趣的分歧:我显然尊重您的意见,并喜欢使用int* fun(int* name)的建议。我不喜欢OP所使用的引用方式,因为它们使代码难以阅读,并且初学者在协作项目中可能会引入错误。如果可能的话,请至少使用const & - Bathsheba
如果您想确保 foo 不被修改,您可以使用 fun(myName *const &name) - PaperBirdMaster
@PaperBirdMaster:确实是好建议,如果复制值很昂贵的话。但在这种情况下,除非编译器优化内部引用计数,否则采用引用会比按值传递更慢。 - Bathsheba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接