c++ - 如何通过引用传递指针来更改指针指向的位置?

标签 c++ pointers pass-by-reference heapsort

我正在尝试调整堆对象的大小,以便在用户尝试构建超出堆容量的堆时程序可以继续。我能够返回一个指向新堆的指针,但这对我程序的其他部分来说效果不佳。我想直接更改指针 p 指向的位置。这是我这样做的尝试。它编译但指针仍然指向旧位置。请帮助我修复此代码,这样我就不必从我的 BuildHeap 函数返回指针。我会发布我的所有代码,但这是家庭作业,我不希望我的作品被复制。

HEAP* Initialize(int n) {
    HEAP* p;
    p = new HEAP;
    p->size = 0;
    p->capacity = n; 
    p->H = new ELEMENT[p->capacity+1]; //first address not used, so we need +1 here
    return p;
}

void Resize(int n, HEAP*& ptr) { //pass pointer by reference
    ptr = Initialize(n);
}

void BuildHeap(HEAP* p, ELEMENT *A) {
    int length = A[0].key;      //length = array size stored in A[0]
    if(length <= p->capacity) {
        p->size = length;
        for(int i = 1; i <= length; i++) {
            p->H[i].key = A[i].key; //copy ELEMENT array into heap object's H array
        }
        for(int i = (length) / 2; i >= 1; i--) 
            MaxHeapify(p, i);
    }
    else {
        cout << "Error: Heap capacity exceeded. Resizing heap.\n";
        Resize(length, p); //initialize a new, larger heap
        BuildHeap(p, A);
        cout << "Heap built with new heap capacity of " << p->capacity << ".\n";
    }
}

编辑:我能够通过在调用 BuildHeap 之前检查是否需要更改指针来解决我的问题:

if(length > p->capacity) { //resize heap if capacity is exceeded
    cout << "Error: Heap capacity exceeded. Resizing heap.\n";
    p = Initialize(length);
}
BuildHeap(p, A);

最佳答案

我认为你的问题是你只在一个地方使用了对指针的引用,而在其他地方没有。查看BuildHeap的签名:

void BuildHeap(HEAP* p, ELEMENT *A)

在这里,当您调用 BuildHeap 时,会生成作为第一个参数 p 传递的指针的拷贝。您随后对 Resize 的调用会修改该拷贝,但 BuildHeap 的调用者仍然拥有自己的未修改指针。您可能希望更改 BuildHeap 的签名(以及可能的其他方法)以也使用引用:

void BuildHeap(HEAP*& p, ELEMENT *A)

也就是说,您可能需要考虑使用一个类,在该类中使用作为成员变量的指针,这样您就不必一直手动传递它。

关于c++ - 如何通过引用传递指针来更改指针指向的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19470401/

相关文章:

c++ - C++中静态类的目的是什么?

c++ - Visual Studio 2010 随机停止构建

c++ - 从 boost multi_index 数组中 move 元素

c++ - 我现在应该按值(value)传递吗?

c++ - QuantLib 入门指南

C Fuctions 中使用的 Heap 还不清楚

c++ - 声明一个二维指针对象数组

c++ - int & 是什么意思

c# - 我可以有一个接口(interface)参数,通过引用传递吗?

c++ - 指针大小和传递引用与传递指针