一起使用指针和地址运算符

时间:2013-04-01 11:56:06

标签: c++ pointers

我无法理解为什么我们使用*& 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 个答案:

答案 0 :(得分:2)

它是一个通过引用传递的指针。这意味着当first发生变化时:

first = new int[firstSize];

更改传播回调用者。

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

答案 1 :(得分:2)

  

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

类型之后出现的&符号将引用定义为该类型。因此,例如,int&是对int的引用,my_object&是对my_object的引用,而int *&是对{{1}的引用(即指向int*的指针)。

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

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

特别是这两条说明:

int

将动态分配的数组分配给first = new int[firstSize]; second = new int[secondSize]; first。因此,在以下代码片段中(省略号表示其他参数):

second

int* myfirst = NULL; int* mysecond = NULL; splitArray(..., myfirst, ..., mysecond, ...); 返回时,splitArray()myfirst将指向在函数内分配的数组,并分别分配给mysecondfirst。< / p>

如果你没有通过引用传递这些指针,那么在second返回后myfirstmysecond的值仍为NULL(因为{{1}将会处理这些指针的副本

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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