我们应该在“编程基础”课程中教授指针吗?

5
我将在下个秋季教授一门关于编程基础的课程,这是计算机科学专业的第一年级课程。在这样的课程中教授指针有什么优缺点? (我的观点:应该教授)。
编辑:我对“迎合受众”这一观点的问题在于,在大学的前几年,我们(教授)不知道学生是否想成为科学家......我们希望我们知道,但我们必须在那些将留在学校(四年并不能让一个人成为科学家)和那些将成为工程师之间取得平衡。
最终决定:至少提及,但可能不包括指针算术。
9个回答

13

至少你应该教授引用或一些等价概念。我认为你可能应该在指针算术、C 数组和字符串等方面放松一些,但间接寻址是计算机科学中非常重要的概念,学生应该被介绍到这个概念。


是的,我认为这是关键--严格来说,专注于“引用”而不是“指针”。顺便说一下,要花比你想象的更长的时间来解释引用的概念! - Neil Coffey
+1 鼓励早期学习间接寻址。这是一个非常重要的概念,我知道在学习 C 语言之前,我至少需要一年半的课程才能达到“指针境界”。 - Andrew Keeton

6

是的。

指针是其他高级语言中许多概念的基础,我坚信您需要教授一定量的低级内容,以促进对为什么我们要使用任何高级语言的理解。一旦您了解了内存如何分配以及如何使用指针进行地址和操作,解释许多其他结构就变得更容易了。例如,在Java中解释NullPointerException甚至诸如此类语言中引用的概念就像儿戏,如果您有一个理解C中指针(并最好也理解C ++中引用)的人,那就更好了。


4
当然要教他们。无论是使用指针、引用、动态绑定还是其他任何东西,理解间接性对于编程都是必不可少的。当然,不要从一开始就用它们,但是理解间接性至少与理解控制流思想同样重要。
当然,缺点是有些人可能不会理解并且表现不佳或退出。如果这是一个面向想成为计算机科学专业的人的课程,那么不要担心,因为你只是给了他们更早转专业的动力。如果这是一个面向对编程有点兴趣的普通教育课程,那么他们可能仍然应该被介绍,但不要过分强调或评分严格。

1
仅因为关于辍学者的评论而加一分。在英国,太多机构似乎非常担心“可怜的学生”无法理解这些内容,以至于他们将计算机科学稀释成了一些可怕且难以辨认的东西。 - Rob
1
当我担任计算机科学入门课的助教时,我为那些非常努力并每周来参加办公室时间的学生感到难过,但我从未在评估他们时手下留情,因为当你已经花费了两三年的时间却发现自己永远无法真正掌握计算机科学时,这种感觉更糟糕。 - Tyler McHenry

2
在我作为计算机科学专业的学生的第一年,我在秋季学期选修了一门Java课程,这是一个普通的介绍性课程。教授没有直接教指针,但他确实教了引用的概念,以及为什么当对象和原始类型的任何一个被传递给参数时,你可以修改对象而不能修改原始类型。
在我的第二个学期,我选修了该系列的下一门课程,它涉及C语言,这门课程严重依赖指针。
对于一个编程入门课程,我建议只提到引用,而不是直接涉及指针。

1

我认为,“编程基础”课程至少应该涉及基本处理器架构和汇编语言,如果是这样的话,你就不能不讨论指针的问题了。如果你只教授高级(字节码)语言,那么我猜指针可能会让听众感到困惑。


1
优点:对机器使用内存的方式、指向堆上数据和栈上数据的指针区别(以及其中的陷阱)、通过地址传递方法等有牢固的理解。

缺点:对于尚未熟悉计算机结构(包括堆栈是什么,寄存器是什么,调用约定等)或尚未有足够时间消化概念的受众来说,可能过于复杂。

因此,总的来说,这在很大程度上取决于您的受众和要学习的语言 (在LISP或Java的上下文中,指针将毫无意义),以及您愿意深入了解堆、栈、作用域如何被转换为栈(即为什么永远不要返回本地变量的指针)等内容的深度。

当我给工程班教授指针时,我最终在一个简单的“hello world”程序上启动了调试器,并展示了学生实际的机器代码、寄存器值和相应的内存转储,以及栈操作和参数传递等,但他们已经准备好了。您的受众是否愿意接受这样的深入了解,以确保对幕后发生的事情有牢固的理解,而您是否愿意付出这样的努力?:)


+1 - 学生在接触指针之前应该先学习基本的架构知识。如果他们没有掌握这些,那么间接引用/引用就是我所能教授的最深入的内容了。 - Sarah Mei

0

我认为你不应该把它放在第一位去教。而是等到学习编程的基本概念之后再进行。

一个好的例子是 Stroustrup 的最新著作: Programming -- Principles and Practice Using C++,在书中他先教如何制作解析器、I/O(流)用法和GUI用法,然后再谈论指针!

我认为这将是一个很好的教学参考,因为理解我们构建思想的方式比理解我们必须同时处理多少限制(例如内存管理)来使软件工作更加自然。我真的向您推荐这本书,以便从教授编程基础的全新视角来观察。


0

这真的取决于你课程的目标 - 教授编程和教授计算机科学是两个不同的目标,虽然它们并不互斥,但入门课程通常不能同时很好地教授两者。以下是一个例子:假设我们想学习如何对列表进行排序。C++编程课程将教您使用std::sort函数模板的语法,并且作业可能是编写几个比较函数。计算机科学课程将向您解释归并排序是什么,伪代码中算法的样子以及其性能/空间特性,作业将是编写排序函数本身。

因此,如果您正在教授入门级别的编程,则应该教授您的学生有关指针的知识。

如果您正在教授计算机科学,则没有必要在入门级别理解指针。


0

任何自称是优秀程序员的人都必须知道指针的工作原理;成为一名优秀程序员意味着他们不仅知道单一编程语言,而且知道编程语言的通用工作原理,使他们能够适应以前没有接触过的编程语言。

然而,这并不意味着基础编程课程应该教授指针。

  • 如果你的目标是让这些人全面、全面地熟悉编程语言,那么指针当然应该是其中的一部分。
  • 如果你的介绍编程的方式是先使用一种编程语言,然后在随后的课程中涵盖其他语言,并且指针与该语言无关,则无需讨论指针。

我认为,让人们从一种语言开始入门,而不是试图一次性覆盖每种语言的风格,有很多值得探讨的地方。

我的第一门入门编程课程使用的是Haskell。直到后来使用C的课程中才介绍了指针(当我上课时,我已经是一名优秀的C和C++程序员;这些科目是必修的)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接