我个人认为我对指针有一个牢固的把握,但是让我们说
int* pMyPointer;
int number = 1000;
pMyPointer = &number;
cout << pMyPointer << endl;
pMyPointer 可能会返回 0037FBB0 的内存地址,但这有什么关系呢?这在编程时如何有用?
对象身份。
如果您有两个指针或引用,您如何判断使用一个是否会影响另一个?简单地打印所有数据成员的当前值不会告诉您它们是相同的对象还是克隆/副本。
所以当你在调试的时候,你会很关心不同指针中存储的地址是否相同,这就需要你去检查那些地址值。
这是静态内存管理中非常重要的信息。在用户空间应用程序开发中,这些信息可能与大多数开发人员无关,但对于低级开发人员来说却非常重要。请记住,具有静态内存管理器的编程语言将始终是较低级别的语言。
这也是指针如何工作的要点。它们将内存地址存储到它们指向的位置。你也可以像这样创建一个指针:int *mptr = (int*)0x13371234;
. 这将创建一个指向int
at的指针0x13371234
。
它还为您提供有关您的东西存储位置的信息,如果出于任何原因不允许内联汇编,这也可用于确定堆栈的位置。如果你使用malloc,那么它一般不是必须的信息。
一个典型的用途是创建链接的数据结构,如列表和树。
例如,在二叉树中,每个节点都包含一个指向其两个子节点的指针。
就指针而言,实际值本身很少有太大意义。它通常用作“魔法 cookie”——本质上是“魔法”值,让您可以访问某些特定变量。在典型情况下,您将地址保存到指针中,然后取消引用指针以获取该地址处的项目,而无需检查(甚至关心)指针本身的值。
不过,这条一般规则有一些例外。例如,一些内存分配器使用块的地址不仅跟踪块的位置,而且跟踪块的大小。从与大边界对齐的块开始,并始终按 2 的幂分割块,整个地址告诉块的位置,地址的低位告诉块的大小,必须分配以获得到那个地址。
后者绝对是例外。典型的情况是指针的值除了授予对该地址的项目的访问权之外没有任何意义。