【问题标题】:should we teach pointers in a "fundamentals of programming" course?我们应该在“编程基础”课程中教授指针吗?
【发布时间】:2009-03-18 23:48:18
【问题描述】:

我将在明年秋季教授一门编程基础课程,即第一年的计算机科学课程。在这样的课程中教授指针的优点和缺点是什么? (我的立场:应该教他们)。

编辑:我对“迎合你的听众”论点的问题是,在大学的头几年,我们(教授)不知道学生是否愿意成为科学家。 .. 我们希望我们知道,但我们必须在那些将继续上学(科学家不会做 4 年)和将成为工程师的人之间取得平衡。

最终决定:至少是引用,但可能是没有指针运算的指针。

【问题讨论】:

    标签: pointers computer-science


    【解决方案1】:

    至少你应该教授参考资料或一些等效的概念。我认为你应该在指针算术、c 数组和字符串之类的东西上放轻松,但间接是计算机科学中一个非常重要的概念,应该向学生介绍它。

    【讨论】:

    • 是的,我认为这是关键——严格来说,关注“引用”而不是“指针”。顺便说一句,请允许比您想象的更长的时间来解释引用的概念!
    • +1 用于早期教授间接。这是一个非常重要的概念,我知道在我达到“指针必杀技”之前,我至少花了一门半的 C 课程。
    【解决方案2】:

    是的。

    指针是其他高级语言中大量概念的基础,我坚信您需要教授一定数量的低级内容,以便更好地理解我们为什么要为任何事情烦恼更高的级别。

    一旦您了解了内存是如何分配的,以及如何使用指针寻址和操作它,解释许多其他结构就会变得更容易。例如,在 Java 中解释 NullPointerException,甚至在此类语言中解释引用的概念,如果你有人懂 C 中的指针(如果他们也懂 C++ 中的引用,那就更好了)。

    【讨论】:

      【解决方案3】:

      绝对教他们。理解间接对于编程来说是必不可少的,无论是指针、引用、动态绑定还是其他任何东西。现在显然不要从它们开始,但理解间接性至少与理解控制流思想一样重要。

      当然,缺点是有些人不会得到它,并且会表现不佳或辍学。如果这是为那些想成为 CS 专业的人开设的课程,那么不要担心,因为你只是在鼓励他们更早地而不是更晚地转换专业。如果它是为对编程感兴趣的人提供的更多或通识课程,那么可能仍应介绍它们,但不要苛刻或重度评分。

      【讨论】:

      • +1 纯粹是为了评论辍学。太多的机构(至少在英国这里)似乎非常担心“穷学生”无法理解这些东西,以至于他们将 CS 稀释成可怕且无法辨认的东西。
      • 当我 TA'ed 介绍 CS 时,我为那些努力尝试并且每周都来上班但仍然没有真正得到它的学生感到抱歉。但我从不轻易评估它们,因为当你已经投入了两三年后,发现你永远不会真正获得 CS 会更糟。
      【解决方案4】:

      在我作为 CS 学生的第一年,我在秋季参加了 Java 课程,这是一般介绍。教授没有直接教指针,但他确实教了引用的概念,以及为什么你可以修改对象,而不是在参数中传递原语时。

      在我的第二学期,我参加了该系列的下一门课程,这是关于 C 的,这门课非常依赖指针。

      对于编程类的介绍,我想说的是只提到引用,而不是直接提到指针。

      【讨论】:

        【解决方案5】:

        我认为“编程基础”课程至少应该涉及基本的处理器体系结构和汇编语言,如果是这样,你就不能真正提出不讨论指针的理由。 如果你只教高级(字节码)语言,那么我猜指针会让观众感到困惑。

        【讨论】:

          【解决方案6】:

          优点:深入了解机器使用内存的方式、指向堆上数据的指针与指向栈上数据的指针之间的区别(和缺陷)、传递方法按地址等。

          缺点:对于尚未了解(或没有足够时间吸收概念)计算机体系结构(包括什么是堆栈、什么是寄存器、调用约定等)的观众来说很复杂.

          因此,总而言之,这在很大程度上取决于您的受众和您将处理的语言(指针在 LISP 或 Java 的上下文中将毫无意义),以及关于你愿意在什么是堆、什么是堆栈、范围如何转换为堆栈(即为什么永远不要返回指向局部变量的指针)等方向上走多远。

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

          【讨论】:

          • +1 - 学生在被介绍给指针之前应该学习基础架构。如果他们没有那个,那么间接/引用就和我一样远了。
          【解决方案7】:

          我认为你不应该首先教它。但后来,一旦掌握了编程的基本概念。

          一个很好的例子是 Stroustrup 的最后一本书:Programming -- Principles and Practice Using C++,他在其中教授如何制作解析器、I/O(流)使用和 GUI 使用,甚至在谈论指针之前!

          我认为这将是一个很好的教学参考,因为它更自然地理解我们构建想法的方式,而不是我们必须同时处理多少限制(例如内存管理)才能使软件工作。我真的向您推荐这本书,让您对编程基础知识的教学有一个全新的视角。

          【讨论】:

            【解决方案8】:

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

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

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

            【讨论】:

              【解决方案9】:

              任何自称为优秀程序员的人都必须知道指针是如何工作的;成为一名优秀的程序员意味着他们不会只知道一种编程语言,而是知道编程语言的一般工作原理,从而使他们能够适应以前从未见过的编程语言。

              但这并不意味着编程课程的基础知识应该是教学指针。

              • 如果您的目标是让这些人全面、全面地熟悉一般的编程语言,那么是的,指针应该是其中的一部分。
              • 如果您将它们介绍给编程的方式是首先使用一种编程语言,并打算在后续课程中涵盖其他语言,并且指针与该语言无关,那么现在还没有必要谈论指针。

              我认为,让人们从一种语言开始,而不是试图同时涵盖所有语言风格,这有很多话要说。

              我的第一个编程入门课程使用了 Haskell。直到随后的 C 课程才引入了指针(当我参加这门课程时,我已经是一名优秀的 C 和 C++ 程序员;这些课程是必修的)。

              【讨论】:

                猜你喜欢
                • 2022-06-15
                • 2011-12-24
                • 2014-06-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-09-11
                相关资源
                最近更新 更多