在C++中,假设我有
class Sample{
public:
void someFunction();
};在main()中,
Sample obj;
obj.someFunction();
AND
Sample *obj = new Sample();
obj->someFunction();
delete obj;在C++中,我可以只使用obj而不是*obj来实现链表和树数据结构吗?这是唯一的疑问。
发布于 2021-06-08 19:56:33
在实现链表时,您总是需要一个指针(或引用)。这是链接到列表中的下一个值所必需的。例如,对于您的代码,您需要
class Sample{
public:
Sample *next;
void someFunction();
};你不能构建这样的东西:
class Sample{
public:
Sample next;
void someFunction();
};因为将会有无限的样本被装进另一个盒子里。编译器无法知道列表应该有多长(因此,如果您知道编译时的大小,则可以使用一些模板参数)
next将指向列表中的下一个值。因此,在你的main中,你将拥有:
int main() {
// allocate 2 Sample objects
Sample *s1 = new Sample();
Sample *s2 = new Sample():
// link them together
s1->next = s2;
delete s1;
delete s2;
}当然,您可以将它们放在main的本地,例如:
int main() {
// 2 Sample objects on the stack
Sample s1;
Sample s2:
// link them together
s1.next = &s2;
}这里最大的区别是s1和s2是主函数的本地函数。只要我们讨论main,这就很好,但你不能这样做:
Sample f() {
Sample s1, s2;
s1.next = &s2;
return s1;
}因为s2在f结束后不存在,所以s1.next将是一个无效的指针。
发布于 2021-06-08 20:51:35
我会把这个问题理解为-指针在链表中的作用是什么?
链接节点是链表中指针的基本作用,但其核心是链表的动态特性。
要得到答案,您首先需要理解内存管理的概念。主要有两段内存分配给一个正在运行的程序,即堆栈和堆。堆栈被称为静态内存堆栈( static memory ),因为它的大小是固定的,不会随着程序的需求而增长。堆被称为动态内存堆( dynamic memory ),因为它可以根据需要进行扩展和缩小。
这就是我们分别在堆栈和堆中分配内存的方式-
Sample obj; //this takes up space from stack i.e. `obj` resides in stack
Sample *obj = new Sample(); //a new chunk of memory is allocated from heap指针是访问堆部分中分配的内存的方式。现在问题变成-为什么要使用动态内存(或堆)?
树或链表是一种动态数据结构,这意味着我们不能预先知道树或链表的大小,因为它们在程序运行过程中会增长和缩小。因此,如果我们继续使用堆栈中的内存,那么在某个时刻,我们可能会耗尽堆栈内存,这将导致。
如果你想了解更多关于指针和动态内存的知识,这里有一个link。
https://stackoverflow.com/questions/67886225
复制相似问题