理解指针的问题
issues in understanding pointers
以下代码来自《编程访谈》一书我很难理解指针的概念。为什么我们不能使用1号代码呢。
代码1
bool insertInFront( IntElement *head, int data )
{
IntElement *newElem = new IntElement;
if( !newElem ) return false;
newElem->data = data;
head = newElem; // Incorrect!
return true;
}
代码编号2
bool insertInFront( IntElement **head, int data )
{
IntElement *newElem = new IntElement;
if( !newElem ) return false;
newElen->data = data;
*head = newElem; // Correctly updates head
return true;
}
-
在代码1中,将
newElem
的指针位置分配给head
的本地副本。当函数返回时,head
被破坏,并且您将有内存泄漏(您丢失了指向newElem
的指针,使您无法访问delete
。)您只更改了函数的指针的本地副本,调用方的副本不受影响。 -
在代码2中,
head
是一个点对点的帧。您不仅仅有一个指针,实际上还有一个指向调用者指针的指针。这允许您更改调用方的指针,将指针存储到newElem
。当函数返回时,head
被销毁,但它只是指针对指针。原始指针在调用方的作用域中保持不变。
假设您正在调用函数1作为:
insertInFront(H, data);
在调用函数时,计算机会复制参数,然后在函数返回时释放它们。因此,在代码No.1中,head=newElem
将newElem
的地址分配给head
(它是H
的副本),然后释放head
,newElem
的地址永远丢失。然而,在代码2中,函数应被调用为:
insertInFront(&H, data);
这意味着H
的ADDRESS被复制到head
,并且newElem
的地址被分配到*head
,即head
所指向的位置,这导致了H
。通过这种方式,您可以在函数返回后获得newElem
的地址。
指针的概念非常复杂。基本上,你需要思考指针的方式是,它们本身就是"值"。所以:
*head = some_memory_address_that_points_to_head;
可以被认为是:
int im_a_pointer_to_head = some_memory_address_value_to_head;
因此,如果我们将同样的概念应用于您的第一个函数:
bool insertInFront(int im_a_pointer_to_head, int data)...
您实际上是在传递头指针值的副本,在函数中更改它只会更改为该函数创建的临时副本,而不会实际更改原始指针指向的位置。
第二个函数解决了这个问题,因为你实际上是在传递指向指针头的指针的副本(试着说3倍快!)。在这种情况下,您不会更改复制的值,而是更改实际指针指向的位置。
要更改在函数调用之外通过函数参数传递的任何值(并保持该更改),必须具有要更改其值的内存地址。这是另一种说法,即必须"通过引用传递"而不是"通过值传递"——否则,通过值传递将导致函数只更改COPY。
- 关于 c++ 函数中指针赋值的简单问题
- 链表指针问题
- C++ 关于指针取消引用的技术问题
- C++中的指针和常量问题不大
- 包含矢量指针的结构的内存释放问题
- 指针问题:从不兼容的类型"int"分配给"int *"
- 将字节数组转换为带有字节序问题的指针
- 关于如何使用指向主窗口的指针的 QT 问题
- 当成员值从指针更改为非指针时,C++常量问题
- 为什么循环会导致指针出现问题?
- 使用指针计算堆栈问题的大 O 表示法
- 构造函数 (C++) 中的 char 指针参数存在问题
- 指向包含对齐 C 结构C++类的 C 指针的对齐问题
- 涉及指针和手动实现的矩阵类的问题
- 从基指针到派生的强制转换问题
- 迭代器的指针操作问题
- 64 位迁移问题:指针更改
- C++模板使用问题指针
- 跳到C++第13章练习问题4-指针
- 用std::pair数组初始化std::map问题(指针错误?)