好的,假设我们在C ++中有一个链表实现。此外,假设节点是一个类,列表本身是一个类,它看起来像这样:
#include <iostream>
using namespace std;
class List;
class Node
{
private:
Node(char, Node*);
char data;
Node* next;
friend class List;
friend ostream& operator<<(ostream&, const List&);
};
class List
{
public:
List(int = 0);
List(const List&);
~List();
bool gotoBeginning();
bool gotoEnd();
bool gotoNext();
bool gotoPrior();
bool insert(char);
bool remove(char&);
bool empty() const;
bool full() const;
bool clear();
List& operator=(const List&);
friend ostream& operator<<(ostream&, const List&);
private:
Node* head;
Node* cursor;
};
#endif
假设列表为空。 此外,假设我们刚刚在列表中插入了一个新元素'z',这意味着列表当前有1个节点。
让我们看看插入函数:
bool List::insert(char item)
{
if(empty())
{
Node* newNode = new Node(item, NULL);
head = cursor = newNode;
return true;
}
else
{
// I dont need to show this part because the above code will suffice
}
}
好的,所以我们都知道变量newNode是指向节点的类型指针,它被分配了包含已经存储在堆上的节点的内存位置。
现在记得我们刚创建了一个新节点,并假设传递给insert函数的项是'z'
Memory Allocation Stack Heap | | | | \|/ \|/ 512 902 memory address | -----| |--->|-----|-----| | 902 | | | 'z'| NULL| |------|---| |-----|-----| newNode (no name/ newNode) variable name
(无名称):因为堆上分配的内存不能通过指针直接访问。
我遇到的问题是这个。 newNode指针是否在堆栈上创建并且如上所示分配了一些像512这样的内存地址? 或者指针从未在堆栈上分配(所以只删除上面的512)并且只指向在堆上创建的内存(902)?
我问的原因是因为insert函数内部if语句内的第二行代码将newNode分配给head和cursor
是什么让我感到困惑。头和光标现在是否包含地址512或902?如果我们继续并在insert函数内部的else语句中编写代码,那么它将如下所示:
bool List::insert(char item)
{
if(empty())
{
Node* newNode = new Node(item, NULL);
head = cursor = newNode;
return true;
}
else
{
Node* newNode = new Node(item, NULL);
cursor = cursor->next = newNode; // what is this line doing
return true;
}
return false;
}
那么cursor->next
如何获得新节点的值,cursor
也获得新节点的值。
是的,上面的功能运行正常,我在项目上得到了A,所以所有的代码都是正确的,但我提到的概念让我感到不安
答案 0 :(得分:1)
new
返回的指针需要存储在某处,并存储在堆栈变量newNode
中。 newNode
及其内容的值是new
返回的地址。
当你指向另一个指针的指针时,它指的是指针的值,指针指向的内容,地址,复制指针。
所以当你这样做时
head = newNode;
然后head
将获得与newNode
相同的值,并指向由new
表达式分配的内存。
让我们举个小例子:假设你有两个指针:
int* a;
int* b;
您分配了一些内存并分配给a
:
a = new int;
现在内存看起来像这样:
+---+ +------------------+ | a | --> | allocated memory | +---+ +------------------+
然后您从a
分配到b
:
b = a;
然后内存看起来像这样:
+---+ | a | -. +---+ | +------------------+ >-> | allocated memory | +---+ | +------------------+ | b | -' +---+
存储变量a
和b
的确切位置并不重要,它们指向的位置也不重要。