【问题标题】:What would be a good real world metaphor to use to describe pointers in C? [duplicate]用什么来描述 C 中的指针是一个很好的现实世界隐喻? [复制]
【发布时间】:2013-03-26 23:06:01
【问题描述】:

我发现我通过现实世界的比较隐喻学得最好。例如,在 java 中,帮助我很好地理解 Accessors 和 Mutators 概念的一种方法是通过中间人的概念来思考它(私有变量不喜欢直接与他们的客户打交道,他们更喜欢中间人(访问器和突变器)处理它们)

C 中指针的概念对我来说仍然有点棘手。用什么比喻来描述它们是如何工作的?

【问题讨论】:

  • 指针告诉你数据的位置。它就像一本书中的索引——它告诉你在哪里可以找到你的数据。索引可能会说“转到第 10 页”。即使第 10 页上的数据发生变化,您的索引仍然指向那里。与指针相同。
  • 这几乎是以前社区 wiki 帖子的直接复制品,得分很高。
  • @MichaelDorgan:请链接!
  • 就是这个 - 感谢您找到它!

标签: c pointers


【解决方案1】:

我一直喜欢指针就像你的手指的类比。如果我带你去停车场并让你给我找一辆红色汽车,你伸出一根手指(你的选择;))并指向一辆红色汽车。

你的手指不是答案。你的手指什么也没告诉我,但如果我看看你手指指向的地方,我就能找到我要找的东西。

现在我可以要求您找到一辆蓝色汽车,您可以将手指重新分配(重新分配)到一辆新车上。现在您的指针(与以前相同)正在向我显示相同类型的新数据。指针没有改变,只是它指向的东西。

这也适用于多个指针。我可以问一下指向蓝色汽车的指针在哪里,你可以用另一只手用手指指向第一根手指。现在,如果我想知道蓝色汽车在哪里,我可以按照食指的方向找到第二个手指,转至汽车(数据)。

【讨论】:

    【解决方案2】:

    你可以想象,就像现实世界的地址一样,它们只是告诉你在内存中的哪里可以找到东西,增加一个指针(我在这里指的是pointer arithmetic)就像搬到隔壁的房子一样,有一个看看这个answer另一个问题。

    【讨论】:

      【解决方案3】:

      您可以将它们想象成电话号码,告诉您如何联系某人。

      拨打电话号码就像取消引用指针。

      电话可能已断开连接。也许已经很久了,现在别人有了电话号码。这就像一个悬空指针。

      【讨论】:

      • 比喻适用于单个指针,但是指向 int 的指针呢?
      • 知道下一个人电话号码的人的电话号码?
      • 指向指针的指针是公司前台的电话号码。然后,接待处的那个角色可以将呼叫定向/转发给您尝试联系的最后一个人(将您连接到他们的分机)。
      • 是的,我喜欢 Gavin 的建议。像所有明喻/隐喻/类比一样,会有一些不合适的东西。随意指出适合的问题或其他方面。我已经把它做成了社区 wiki,所以如果你愿意,可以继续编辑。
      • @FredLarson 你的答案如何在一次修订中变成community wiki
      【解决方案4】:

      假设一个电子表格的场景,您的数据分散在各处,但是当您可以使用行号和列号调用特定数据时,您会得到正确的数据。

      行和列是指针。

      现在您可以将这些行号和列号存储到另一个电子表格中,供您参考。而且这个电子表格现在也有行号和列号来确定数据,这是对原始电子表格的实际数据的引用。

      【讨论】:

        【解决方案5】:

        不需要比喻。指针是保存内存地址的变量。期间。

        【讨论】:

        • 他没有问他是否需要它,他问的是隐喻是否有人能想出一些,据我所知,如果我错了,请纠正我
        • @WingsOfIcarus 我明白这一点。但通常情况下,尝试创建一个隐喻(尤其是对于琐碎的事情)可能会让你真正理解更少的概念。
        • 很多人——尤其是初学者——都很难理解它们,所以它并不像你想象的那么简单。也许当您最终了解它们时,它们可能会变得微不足道。
        • @Bart Friederichs 确实如此,但如果你想向刚接触编程的人解释它,使用隐喻来表示它不是坏主意,因为大多数人一开始往往在理解指针方面存在问题.
        • @WingsOfIcarus 我知道。隐喻真的可以帮助理解这个概念。但是一个干净、正确的定义也总是有帮助的。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-14
        • 1970-01-01
        • 2012-01-21
        • 2010-12-08
        • 2013-06-27
        • 1970-01-01
        相关资源
        最近更新 更多