首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以使用类的对象代替指向对象的指针来实现链表?

是否可以使用类的对象代替指向对象的指针来实现链表?
EN

Stack Overflow用户
提问于 2021-06-08 19:42:28
回答 2查看 57关注 0票数 0

在C++中,假设我有

代码语言:javascript
运行
复制
class Sample{
 public:
 void someFunction();
};

在main()中,

代码语言:javascript
运行
复制
Sample obj;
obj.someFunction();

AND

Sample *obj = new Sample();
obj->someFunction();
delete obj;

在C++中,我可以只使用obj而不是*obj来实现链表和树数据结构吗?这是唯一的疑问。

EN

回答 2

Stack Overflow用户

发布于 2021-06-08 19:56:33

在实现链表时,您总是需要一个指针(或引用)。这是链接到列表中的下一个值所必需的。例如,对于您的代码,您需要

代码语言:javascript
运行
复制
class Sample{
public:
 Sample *next;
 void someFunction();
};

你不能构建这样的东西:

代码语言:javascript
运行
复制
class Sample{
    public:
     Sample next;
     void someFunction();
    };

因为将会有无限的样本被装进另一个盒子里。编译器无法知道列表应该有多长(因此,如果您知道编译时的大小,则可以使用一些模板参数)

next将指向列表中的下一个值。因此,在你的main中,你将拥有:

代码语言:javascript
运行
复制
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的本地,例如:

代码语言:javascript
运行
复制
int main() {
 // 2 Sample objects on  the stack 
 Sample s1;
 Sample s2:

 // link them together
 s1.next = &s2;
}

这里最大的区别是s1和s2是主函数的本地函数。只要我们讨论main,这就很好,但你不能这样做:

代码语言:javascript
运行
复制
Sample f() {
 Sample s1, s2;
 s1.next = &s2;
 return s1;
}

因为s2在f结束后不存在,所以s1.next将是一个无效的指针。

票数 1
EN

Stack Overflow用户

发布于 2021-06-08 20:51:35

我会把这个问题理解为-指针在链表中的作用是什么?

链接节点是链表中指针的基本作用,但其核心是链表的动态特性。

要得到答案,您首先需要理解内存管理的概念。主要有两段内存分配给一个正在运行的程序,即堆栈和堆。堆栈被称为静态内存堆栈( static memory ),因为它的大小是固定的,不会随着程序的需求而增长。堆被称为动态内存堆( dynamic memory ),因为它可以根据需要进行扩展和缩小。

这就是我们分别在堆栈和堆中分配内存的方式-

代码语言:javascript
运行
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67886225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档