![](/img/trans.png)
[英]How do I change where the pointer is pointing to through a return statement?
[英]How do I change where a pointer points by passing it by reference?
我正在尝试调整堆对象的大小,以便在用户尝试构建超过堆容量的堆时程序可以继续。 我能够返回指向新堆的指针,但这对我的程序的其他部分不起作用。 我想直接改变指针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)
也就是说,您可能需要考虑使用一个使用指针的类,这是一个成员变量,因此您不必一直手动传递它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.