将数据改为乱码而不是指针是不好的形式?

时间:2011-11-21 22:14:16

标签: c pointers

这本身并不是一个家庭作业问题,只是一个在我做作业时一直唠叨我的问题。我的书有时会提供关于重新排列数据的练习,并且明确地说要通过仅更改指针而不是移动数据来做到这一点(例如,在链接列表中使用带有数据字段和下一个/的“节点”结构)指针字段,只更改下一个字段)。

移动数据是不好的形式?有时似乎更有意义(无论是效率还是清晰度)将数据从一个结构移动到另一个结构而不是改变指针,我想我只是想知道是否有充分的理由避免这样做,或者如果教科书强加了这种约束,以更有效地指导我的学习。

感谢您的任何想法。 :)

6 个答案:

答案 0 :(得分:4)

以下是3个理由:

通用性/可维护性

如果您可以通过仅修改指针来使算法工作,那么无论您在“节点”中放置什么类型的数据,它都将始终有效。

如果您通过修改数据来实现,那么您的算法将与您的数据结构结合,如果您更改数据结构,则可能无效。

<强>效率

此外,你提到效率,你会很难找到一个比复制指针更有效的操作,指针只是一个整数,通常已经是一个机器字的大小。

<强>安全

更进一步,指针操作路由不会引起与其他代码的混淆,其他代码有自己的数据指针,就像@caf指出的那样。

答案 1 :(得分:1)

这取决于。移动较小的东西通常是有意义的,所以如果被洗牌的数据大于指针(通常就是这种情况),那么改组指针而不是数据更有意义。

此外,如果其他代码可能保留了指向数据的指针,那么它就不会期望数据从下面改变,所以这再次指向混乱指针而不是数据。

答案 2 :(得分:1)

当复制或移动实际对象很困难或效率低时,就会进行混洗指针或索引。如果更方便的话,对对象本身进行自调整没有任何问题。

事实上,通过消除指针,您可以消除指针所带来的一大堆潜在问题,例如是否以及何时以及如何删除指针。

答案 3 :(得分:0)

移动数据需要更多时间,并且根据数据的性质,它可能也不喜欢重定位(例如,无论出于何种原因,包含指针的结构)。

答案 4 :(得分:0)

如果你有指针,我认为它们存在于动态内存中...... 换句话说,它们只是存在......那么为什么要费心将数据从一个更改为另一个,必要时重新分配?

通常,列表的目的是从各处获取值,从内存角度到连续列表。

使用这样的结构,您可以重新排列和重新排序列表,而无需移动数据。

您必须明白,移动数据意味着读写内存(而不是重新分配)。

耗费资源......所以只重新订购地址会更有效率!

答案 5 :(得分:0)

这取决于数据。如果您只是在intchar移动,那么对数据进行混洗并不比指针更昂贵。但是,一旦你通过一定的规模或复杂性,你就会开始迅速失去效率。通过指针移动对象将适用于任何包含的数据,因此习惯使用指针,即使在作业中使用的玩具结构上,也可以帮助您处理那些没有的大型复杂对象。

在处理类似链表的事情时,通过指针处理事物尤其惯用。链表的重点是节点部分可以像你想的那样大或复杂,并且改组,排序,插入或删除节点的语义都保持不变。这是C ++中模板化容器的关键(我知道这不是这个问题的主要目标)。 C ++还鼓励您考虑并限制数据随机播放的次数,因为这涉及每次移动时调用每个对象的复制构造函数。这对许多C ++习惯用法都不行,例如RAII,这使得构造函数变得相当昂贵但非常有用。

相关问题