我将在明年秋季开设一门关于编程基础课程的课程,这是一年级的计算机科学课程。在这样的课程中教授指针的优点和缺点是什么? (我的立场:应该教他们。)
编辑:我的“迎合你的观众”这一论点的问题是,在大学的前几年,我们(教授)不知道学生是否想成为科学家。 ..我们希望我们知道,但我们必须在那些将留在学校(4年不是科学家制造)和将成为工程师的人之间取得平衡。
最终决定:至少是引用,但可能是没有指针算术的指针。
答案 0 :(得分:13)
至少你应该教导参考或一些等同的概念。我认为你应该对指针算法,c数组和字符串等事情采取简单方法,但是间接是计算机科学中一个非常重要的概念,应该向学生介绍它。
答案 1 :(得分:6)
是
指针支持其他更高级别语言中的大量概念,我坚信你需要教一些低级别的东西,以便更好地理解为什么我们打扰任何东西更高层次。
一旦你理解了如何分配内存,以及如何使用指针解决和操作,解释许多其他结构变得更容易。例如,解释Java中的NullPointerException
,甚至是这些语言中的引用概念,如果你有一个人理解C中的指针(更好的是,如果他们也在C ++中使用引用),那就是孩子的游戏。
答案 2 :(得分:4)
绝对教导他们。理解间接对于编程是必不可少的,无论是指针,引用,动态绑定还是其他任何东西。现在显然不要从它们开始,但理解间接性至少与理解控制流思想一样重要。
当然,有些人只是不会得到它而且会做得不好或辍学。如果这是一个针对那些想成为CS专业的人的课程,那么就不要因为你只是鼓励他们提前转换专业而不是更晚。如果对于那些对编程有兴趣的人来说,它更多或是一般的编程课程,那么它们应该仍然可以引入,但不会严厉或严重评分。
答案 3 :(得分:2)
在我作为CS学生的第一年,我参加了秋季的Java课程,这是一般的介绍。教授没有直接教指针,但他确实教过引用的概念,以及为什么你可以修改对象,而不是当原语在参数中传递时。
在我的第二学期,我参加了系列中的下一个课程,这是关于C的,这个课程很大程度上依赖于指针。
对于编程类的介绍,我只想提及引用,而不是直接引用。
答案 4 :(得分:1)
我认为“编程的基础”课程至少应该触及基本的处理器架构和汇编语言,如果确实如此,你就不能真正地讨论不讨论指针。 如果你只教授高级(字节码)语言,那么我猜指针会让观众感到困惑。
答案 5 :(得分:1)
优点:充分了解机器使用内存的方式,堆上数据指针(和陷阱)与堆栈上数据指针之间的差异,传递方法按地址等等。
缺点:对于尚未了解(或没有足够时间来理解概念)的计算机体系结构的受众,包括什么是堆栈,什么是寄存器,调用约定等等,都很复杂
因此,总而言之,很大程度上取决于您的受众和您要解决的语言(指针在LISP或Java的背景下将毫无意义),以及你有多深入你的意图是什么是堆,什么是堆栈,范围如何被转换为堆栈(即为什么永远不会返回指向局部变量的指针)等等。
当我教授指向工程类的指针时,我最终在一个简单的“hello world”程序中启动了一个调试器,并向学生展示了实际的机器代码,寄存器值和相应的内存转储,以及堆栈操作和参数传递,等等,但他们已经准备好了。您的观众是否愿意接受这样的深入探险,以确保对幕后发生的事情有充分的理解,并且您愿意这么做? :)
答案 6 :(得分:0)
我认为你不应该教它第一次。但后来,一旦获得了编程的基本概念。
一个很好的例子是最后一本Stroustrup书:Programming -- Principles and Practice Using C++他教授如何在讨论指针之前制作解析器,I / O(流)用法和GUI用法!
我认为它将是一个很好的教学参考,因为理解我们构建想法的方式更自然,而不是我们必须同时处理多少约束(例如内存管理)才能使软件工作。我真的建议你这本书,以便对编程的基础知识有一个全新的视角。
答案 7 :(得分:0)
这实际上取决于你的课程目标 - 教学编程和教学计算机科学是两个不同的目标,虽然它们不是相互排斥的,但是入门课程通常不能同时教授两者。这是一个不同的例子:说我们想学习如何对列表进行排序。 C ++中的编程课程将教你使用std :: sort函数模板的语法,而家庭作业可能会编写几个比较函子。计算机科学课程将向您解释合并排序是什么,算法在伪代码中是什么样的,它的性能/空间特征,以及家庭作业本身就是编写排序函数。
因此,如果你正在教授入门编程,那么是的,你应该教你的学生指点。
如果您正在教授计算机科学,那么不,不需要在入门级别理解指针。
答案 8 :(得分:0)
任何自称为优秀程序员的人都必须知道指针是如何工作的;作为一名优秀的程序员意味着他们不仅只知道一种编程语言,而且他们知道编程语言的工作原理,使他们能够适应他们以前从未见过的编程语言。
然而,这并不意味着编程课程的基础应该是教学指针。
我认为只用一种语言开始人们,而不是试图一次性涵盖所有语言风格,可以说很多话。
我的第一个入门编程课程使用了Haskell。直到使用C的后续课程才引入指针(当我参加课程时,我已经是一名优秀的C和C ++程序员;这些课程是强制性的。)