1

我不明白我们为什么要使用 *&first (指针和地址运算符一起使用)。这是什么意思?我应该什么时候使用它?

void splitArray (int *A, int size, int ind1, int ind2, int *&first, int &firstSize,int *&second, int &secondSize)
{
    firstSize = ind2 - ind1 + 1;
    secondSize = size - firstSize;

    first = new int[firstSize];
    second = new int[secondSize];

    int cnt1 = 0, cnt2 = 0;
    for (int i = 0; i < size; i++)
    {
        if ((i >= ind1) && (i <= ind2)){
        first[cnt1] = A[i]; 
        cnt1++;
    }
    else 
        {
    second[cnt2] = A[i]; 
    cnt2++;
        }
    }
}
4

4 回答 4

2

它是一个通过引用传递的指针。这意味着何时first更改:

first = new int[firstSize];

更改传播回调用者。

从根本上说,这与传递的方式没有什么不同firstSize,只是它first恰好是一个指针。

于 2013-04-01T11:56:57.787 回答
2

这是什么意思?我应该什么时候使用它?

&出现在类型之后的符号定义了对该类型的引用。因此,例如,int&是对 an的引用intmy_object&是对 的引用my_object,并且int *&是对 an 的引用int*(即对指向 an 的指针的引用int)。

当它出现在函数签名中时,这意味着相应的参数将通过引用而不是通过值传递:当通过值传递时,函数接收参数的副本;另一方面,当通过引用传递时,函数直接对传递的参数进行操作。

因此,通过引用传递指针意味着函数对该指针的值所做的更改将影响传递的原始参数。

特别是这两条指令:

first = new int[firstSize];
second = new int[secondSize];

将动态分配的数组分配给firstsecond。因此,在以下代码片段中(省略号表示其他参数):

int* myfirst = NULL;
int* mysecond = NULL;
splitArray(..., myfirst, ..., mysecond, ...);

从 , 返回时splitArray()myfirstmysecond将指向函数内部分配的数组,并分别分配给first和。second

如果您没有通过引用传递这些指针,那么myfirstand的值mysecond仍然会NULLsplitArray()返回之后(因为splitArray()将处理这些指针的副本)。

于 2013-04-01T11:59:01.620 回答
0

& 将其前面的所有内容视为要引用的类型。有时您需要传递指针本身而不是它的副本。例如,您可能需要在将要使用的函数中分配内存。因此,您将指针作为引用传递以能够处理它,而不是它指向的地址。

于 2013-04-01T12:26:39.277 回答
0

有时,在对象的其余实现包括构造函数指令之前,程序员使用引用来确保当前存在的指针对象来初始化对象。

于 2013-04-01T14:54:16.733 回答