理解指针的障碍是什么?如何克服这些障碍?

为什么指针对于 C 或 C 的许多新的甚至老的大学水平的学生来说如此重要?是否有任何工具或思维过程可以帮助您了解指针在变量、函数和其他级别的工作原理?

有哪些好的做法可以让某人达到“啊哈,我明白了”的水平,而又不会让他们陷入整体概念的泥潭?基本上,像场景一样演练。

请先 登录 后评论

8 个回答

grom

我不明白指针有什么令人困惑的地方。它们指向内存中的一个位置,即它存储的内存地址。在 C/C 中,您可以指定指针指向的类型。例如:

int* my_int_pointer;

说 my_int_pointer 包含指向包含 int 的位置的地址。

指针的问题在于它们指向内存中的某个位置,因此很容易进入您不应该进入的某个位置。作为证据,请查看 C/C 应用程序中来自缓冲区溢出的众多安全漏洞(增加指针超过分配的边界)。

请先 登录 后评论
Matt Mitchell

我不认为指针作为一个概念特别棘手 - 大多数学生的心智模型映射到这样的东西,一些快速框草图会有所帮助。

困难,至少我在过去经历过并看到其他人处理过的困难在于,C/C 中的指针管理可能会不必要地令人费解。

请先 登录 后评论
JSN

指针似乎让这么多人感到困惑的原因是它们大多没有或很少有计算机体系结构的背景。由于许多人似乎并不了解计算机(机器)的实际实现方式 - 在 C/C 中工作似乎很陌生。

一个练习是让他们实现一个简单的基于字节码的虚拟机(在他们选择的任何语言中,python 都非常适合),其指令集专注于指针操作(加载、存储、直接/间接寻址)。然后让他们为该指令集编写简单的程序。

任何需要比简单加法稍微多一点的东西都将涉及指针,他们肯定会得到它。

请先 登录 后评论
bruceatk

我不认为指针本身令人困惑。大多数人都能理解这个概念。现在您可以考虑多少个指针或您对多少个间接级别感到满意。不需要太多就可以将人置于边缘。事实上,它们可能会被您的程序中的错误意外更改,这也会使它们在您的代码出现问题时非常难以调试。

请先 登录 后评论
Lasse Vågsæther Karlsen

指针是一个概念,很多人一开始可能会感到困惑,特别是在复制指针值并仍然引用同一内存块时。

我发现最好的类比是将指针视为一张纸,上面有房屋地址,而它引用的内存块则是实际房屋。从而可以轻松解释各种操作。

我在下面添加了一些 Delphi 代码,并在适当的地方添加了一些注释。我选择 Delphi 是因为我的其他主要编程语言 C

请先 登录 后评论
Tryke

在我的第一节 Comp Sci 课上,我们做了以下练习。诚然,这是一个大约有 200 名学生在里面的演讲厅......

教授在黑板上写:int john;

约翰站起来

教授写道:int *sally = &john;

莎莉站起来,指着约翰

教授:int *bill = sally;

比尔站起来,指着约翰

教授:int sam;

山姆站起来

教授:bill = &sam;

比尔现在指向山姆。

我想你明白了。我想我们花了大约一个小时来做​​这件事,直到我们了解了指针分配的基础知识。

请先 登录 后评论
Derek Park

指针的复杂性超出了我们可以轻松教授的范围。让学生互相指指点点和使用写有住址的纸片都是很好的学习工具。他们在介绍基本概念方面做得很好。事实上,学习基本概念对于成功使用指针至关重要。但是,在生产代码中,通常会遇到比这些简单演示所能封装的更复杂的场景。

我曾参与过一些系统,在这些系统中,我们的结构指向其他结构,指向其他结构。其中一些结构还包含嵌入式结构(而不​​是指向其他结构的指针)。这就是指针真正令人困惑的地方。如果您有多个间接级别,并且您开始以这样的代码结束:

widget->wazzle.fizzle = fazzle.foozle->wazzle;

它很快就会变得混乱(想象有更多的行,可能还有更多的级别)。放入指针数组和节点到节点指针(树、链表),情况会变得更糟。我见过一些非常优秀的开发人员在开始使用此类系统后就迷失了方向,即使是非常了解基础知识的开发人员也是如此。

指针的复杂结构也不一定表示编码不佳(尽管它们可以)。组合是良好的面向对象编程的重要组成部分,在使用原始指针的语言中,它不可避免地会导致多层间接。此外,系统通常需要使用第三方库,其结构在风格或技术上彼此不匹配。在这种情况下,复杂性自然会出现(当然,我们应该尽可能地与之抗争)。

我认为大学可以帮助学生学习指针的最好方法是使用好的演示,结合需要使用指针的项目。一个困难的项目比一千个演示更有助于指针理解。演示可以让你粗浅的理解,但要深入掌握指针,你必须真正使用它们。

请先 登录 后评论
Mike Minutillo

我认为人们对它有困难的主要原因是它通常没有以有趣和引人入胜的方式教授。我想看到一位讲师从人群中抽取 10 名志愿者,每人给他们一个 1 米的直尺,让他们以某种形式站立并用直尺相互指向。然后通过移动人们(以及他们将标尺指向何处)来显示指针算术。这将是一种简单但有效(最重要的是令人难忘)的展示概念的方式,而不会陷入机制中。

一旦你学习了 C 和 C,对某些人来说似乎变得更难了。我不确定这是因为他们最终将他们没有正确掌握的理论付诸实践,还是因为在这些语言中指针操作本质上更难。我不太记得我自己的转换,但我知道 Pascal 中的指针,然后转移到 C 并完全迷失了。

请先 登录 后评论
  • 26 关注
  • 0 收藏,115 浏览
  • David McGraw 提出于 2019-02-11 04:32