好的,在我有机会忽略和跳过指针之后(当我第一次开始学习 C++ 时它们看起来真的很复杂>.<),我终于决定了解它们是什么以及如何使用它们。
所以现在我知道如何使用指针了,我唯一想不通的就是你为什么要使用它们。我已经在互联网上搜索了将近 7 个小时,但仍然找不到合适的解释。
那么,请有人向我解释一下使用指针的意义是什么?(如果可以的话,给我一个例子,最好是一个做一些相对有用的函数的例子,这样我就可以理解了)。
指针只是一个数字,用于存储内存位置的数字索引。每种语言的每个重要程序都需要这样的数字来跟踪有趣的函数和数据的位置。在某些语言中,指针的使用是隐藏的——您只会看到一些标识符,如“employee_name”,并且在内部编译器或解释器已安排存储并将指针传递给它,因为它需要使程序按照语言规定的方式运行,但它们总是在下面。
如果你看不到指针的使用,你就不能总是推断出语言中的哪些操作是便宜的,哪些会产生成本。
在 VB 等一些低级语言中,过去无法使用更高级的数据类型,如关联容器(std::map
, std::unordered_map
)、链表、图形等。必须使用内部使用 C 或 C++ 的笨拙函数来跟踪数据元素之间的关系。直接在 C++ 中工作,您可以自己创建此类数据类型,以使用适合您的精确行为、性能和内存使用折衷来建模任意关系。
C++ 公开了指针,因此您可以明确控制现有对象使用的内存区域是否在程序的不同部分传递,从而可能授予它们更改值甚至释放内存的访问权限。这比 Java、Ruby 和 C# 等其他语言更有效,在这些语言中,哪些代码可以访问某些数据而不是该数据的副本,何时可以发生复制,何时不再需要数据,则不太明显。存在诸如垃圾收集之类的东西来尝试跟踪数据的使用,但通常会引入性能问题、效率低下和不可预测的销毁时间——这是否重要取决于应用程序。
最基本的原因是堆栈和堆的有效使用。
Stack 的大小非常有限,它是一个包含变量的容器。
堆(或“空闲存储”)是用于动态分配的大型内存池。它的大小受限于动态内存 (RAM) 中的可用空间。
如果您尝试在没有动态分配和指针的情况下将所有内容存储在堆栈中,您将陷入堆栈溢出。
您还可以将 heap 想象成一个旅行的国家,stack 是您的指南,您可以获取有关餐厅、酒店等位置的信息。