【问题标题】:C(++) Pointers, needing clarification [duplicate]C(++)指针,需要澄清[重复]
【发布时间】:2011-08-23 18:49:21
【问题描述】:

可能重复:
What are the barriers to understanding pointers and what can be done to overcome them?

这可能是我会在这里问的最愚蠢的问题,但是一年来我在谷歌上随意搜索这个想法是什么时候出现的,却一无所获。

有人愿意向我解释一下 C(++) 中指针的使用,它们为什么有用,以及指针的实际应用吗?

我已经知道的:

  1. & 指针在变量名前面时,会将引用更改为指向该变量在内存中的地址。
  2. 指针可节省堆栈空间。
  3. 虽然标准库等库需要对它们有基本的了解,但如果您选择不学习它们,这会严重限制您可以做的事情。

对于那些试图解释的人——如果它有帮助的话——我有 5 年的 Java 业余经验,在实践中——它不像 C 那样处理指针(但是,Java 确实使用指针—— - 请参阅 NullPointerException 以获得证明)。

提前致谢!

【问题讨论】:

标签: c++ c pointers


【解决方案1】:

Java 中的每个对象“引用”实际上都是一个指针。当您将一个对象作为参数传递给 Java 中的方法时,您实际上是在传递一个指向该对象的指针。实际对象没有被复制或任何东西。调用者和被调用者都可以引用同一个对象。这对您来说可能很自然。

相比之下,在 C++ 中,默认情况下,如果您将对象传递给方法,则会复制该对象。如果更改方法中的对象,则调用者中的原始对象保持不变。这对你来说应该奇怪

但是如果您在 C++ 中使用指针,那么 C++ 对象的行为就像 Java 对象一样。对象保留其身份,而不是不断地复制和销毁。呼!

C++ 中的引用是一种伪装的指针;如果通过引用将对象传递给方法,则调用者和被调用者都引用同一个对象,但不能在不损坏原始对象的情况下使被调用者中的变量引用不同的对象。

【讨论】:

  • 我有点怀疑“指针”这个名字是否具有误导性,因为在我每次研究指针的尝试中,都说它们是 point to 一个变量或内存地址,从来没有澄清过它们的含义。我想我明白你在这里的意思。
  • 我有时喜欢用宠物皮带作为比喻,尤其是因为每个人都喜欢用动物/狗/猫来解释多态性。如果你抱着一只狗,那它就是一只狗。如果你拿着一条皮带,它就是一条皮带——但它是系在狗身上的。这是一条狗链。如果您愿意,您可以将牵引绳系在另一只狗身上。或者您可以将它附加到 no Dog(一个空的皮带!)皮带是一种手柄,您可以通过它访问 Dog 的基本功能(续...)
  • 你可以把皮带交给某人,然后他们就可以接触到狗了。您可以将多个皮带连接到同一只狗。一次只有一个人可以牵着一只狗,但任何人都可以牵着一条拴在狗身上的皮带。无论如何,皮带是指向狗的指针。
【解决方案2】:

您的问题没有简单的答案。你只需要学习一段时间。

但是让我这样说:在机器级别,微处理器与内存和寄存器一起工作。指针只是一种允许您直接使用内存的功能。无论如何,这就是计算机所做的。并且有很多方法可以使代码更灵活、更高效或更容易实现。

对于使用它们多年的人来说,它们似乎是世界上最自然的东西。对于像 C# 这样的语言,即使该语言控制它们,它们仍然非常普遍。

【讨论】:

    【解决方案3】:

    指针在堆栈上节省的空间并不像它们的主要功能那么大。

    指针是将地址存储在某些数据的内存中的变量。该地址存储在一个变量中,就像您可以使用变量i 将某些数据的索引存储在数组中一样。 i 不是数据,但它告诉您可以在数组中的什么位置找到它。指针不是数据,但它告诉您可以在内存中的什么位置找到它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-28
      • 2012-07-05
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      相关资源
      最近更新 更多