为什么指针是许多刚开始学习C或c++,甚至上了大学的学生困惑的主要因素?有没有什么工具或思维过程可以帮助你理解指针在变量、函数和级别之外是如何工作的?
有什么好的实践可以让人达到“啊哈,我懂了”的水平,而不会让他们陷入整体概念中?基本上,就是模拟场景。
为什么指针是许多刚开始学习C或c++,甚至上了大学的学生困惑的主要因素?有没有什么工具或思维过程可以帮助你理解指针在变量、函数和级别之外是如何工作的?
有什么好的实践可以让人达到“啊哈,我懂了”的水平,而不会让他们陷入整体概念中?基本上,就是模拟场景。
当前回答
我喜欢家庭地址的比喻,但我一直认为地址是邮箱本身。通过这种方式,您可以可视化解除指针引用(打开邮箱)的概念。
例如在一个链表下面: 1)论文开头写上地址 2)去纸上的地址 3)打开邮箱,找到一张新纸,上面写着下一个地址
在线性链表中,最后一个邮箱中没有任何内容(列表的末尾)。在循环链表中,最后一个邮箱具有其中第一个邮箱的地址。
请注意,第3步是发生解引用的地方,当地址无效时,您将崩溃或出错。假设你可以走到一个无效地址的邮箱前,想象那里有一个黑洞或什么东西,把世界翻个底朝天:)
其他回答
我认为这可能是语法问题。指针的C/ c++语法似乎不一致,而且比实际需要的更复杂。
具有讽刺意味的是,真正帮助我理解指针的是c++标准模板库中迭代器的概念。这很讽刺,因为我只能假设迭代器被认为是指针的泛化。
有时候,只有当你学会忽略树木时,你才能看到森林。
邮政信箱号码。
它是一条信息,允许你访问其他东西。
(如果你计算邮政信箱号码,你可能会有问题,因为信进了错误的信箱。如果有人搬到另一个州——没有转发地址——你就有一个悬浮指针。另一方面,如果邮局转发邮件,那么你就有了指向指针的指针。)
每个C/ c++初学者都有同样的问题,出现这个问题不是因为“指针很难学”,而是因为“解释指针的人以及如何解释”。有的学习者从口头或视觉上理解它,最好的解释方法是用“训练”样例(适用于口头和视觉样例)。
其中“火车头”是一个指针,它不能容纳任何东西,“马车”是“火车头”试图拉(或指向)的东西。之后,你可以对“马车”本身进行分类,它可以容纳动物、植物或人(或它们的混合)。
我喜欢家庭地址的比喻,但我一直认为地址是邮箱本身。通过这种方式,您可以可视化解除指针引用(打开邮箱)的概念。
例如在一个链表下面: 1)论文开头写上地址 2)去纸上的地址 3)打开邮箱,找到一张新纸,上面写着下一个地址
在线性链表中,最后一个邮箱中没有任何内容(列表的末尾)。在循环链表中,最后一个邮箱具有其中第一个邮箱的地址。
请注意,第3步是发生解引用的地方,当地址无效时,您将崩溃或出错。假设你可以走到一个无效地址的邮箱前,想象那里有一个黑洞或什么东西,把世界翻个底朝天:)
指针的复杂性超出了我们可以轻易教授的范围。让学生们互相指指点点和使用写有家庭住址的纸都是很好的学习工具。他们在介绍基本概念方面做得很好。事实上,学习指针的基本概念对于成功使用指针是至关重要的。然而,在产品代码中,通常会遇到比这些简单演示所能封装的复杂得多的场景。
我参与过的系统中,我们有一个结构指向另一个结构指向另一个结构。其中一些结构还包含嵌入式结构(而不是指向其他结构的指针)。这就是指针真正令人困惑的地方。如果你有多个间接层,你最终会得到这样的代码:
widget->wazzle.fizzle = fazzle.foozle->wazzle;
它很快就会让人感到困惑(想象更多的线,可能还有更多的关卡)。再加上指针数组和节点到节点的指针(树、链表),情况就更糟了。我曾见过一些非常优秀的开发人员在开始开发这样的系统时迷失了方向,甚至是那些非常了解基础知识的开发人员。
Complex structures of pointers don't necessarily indicate poor coding, either (though they can). Composition is a vital piece of good object-oriented programming, and in languages with raw pointers, it will inevitably lead to multi-layered indirection. Further, systems often need to use third-party libraries with structures which don't match each other in style or technique. In situations like that, complexity is naturally going to arise (though certainly, we should fight it as much as possible).
我认为大学为帮助学生学习指针所能做的最好的事情就是使用良好的演示,并结合需要使用指针的项目。对于指针的理解,一个困难的项目要比上千个演示做得多。演示可以让您对指针有一个浅显的理解,但要深刻地理解指针,您必须真正地使用它们。