如何通过引用传递指针来更改指针指向的位置
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)
也就是说,您可能需要考虑使用一个类,其中使用指针,指针是成员变量,这样您就不必一直手动传递它。
相关文章:
- 如何使用cudaMallocManaged在指针位置初始化对象?(C++)
- C++指针数组到字符数组中的特定位置
- 声明指针时更改星号的位置
- 如何在单个链表中交换两个节点的位置,只修改指针
- 当原始数据是常量时,修改指针指向的位置是 UB 吗?
- 如果访问对象,则指向的对象内部的指针会更改内存位置
- 访问违规读取位置传递指针以在c中写入的DLL中起作用
- 如何在内存位置取消指针,并用值启动它
- C++ - 智能指针 - 访问冲突读取位置0xDDDDDDDD
- 最简单的方法使多个指针一次指向同一位置,一次只处理2个位置
- 在指针中保存确定的位置
- 试图读取AIFF文件意外错误与指针位置等有关
- 如何在 c++ 中查找文件指针位置
- QTableView并设置指针位置
- 字符串和指针位置
- 对齐C++指针位置的目的是什么
- 正在尝试访问指针位置中的值,并获取seg错误
- C++中的平均指针位置
- 从内存中移除指针位置的项
- 正在设置文件指针位置