在教C时,在指针之前或之后教导数组会更好吗?

对于那些有课程开发经验的人:关于数组的最佳策略是什么?

我见过一些学校在变量和控制结构之后教授数组,甚至在教学function之前。 这允许教授一些基本的算法等。然而,它带来了如何将数组传递给函数的问题,因此有必要回到数组指针被教导和补丁。

另一个选择是从变量和控制结构转到函数,然后教指针,一旦你有指针,从头开始教数组,然后用它来进行动态内存分配。

对我来说第二个选项更有意义,因为与简单变量不同,使用数组很容易“超出范围”,但是尚未了解内存和指针的学生可能无法理解这些界限之外的内容。

但是,我很想知道其他人的想法。

我认为最好的方法是一次引入1个概念。 您不需要在第一个模块中100%解释数组。 您可以通过一次引入1个概念来解决几乎任何问题。

我会按顺序教他们:数组,指针,数组+指针,OtherStuff [N]。


arrays:

您可以先教授简单数组,这样他们就能理解从单个变量名称访问多个数据槽的能力。

//The following doesn't need an understanding of pointers int x[10]; x[0] = 5; 

指针:

然后,您可以通过一些简单的示例开始教授指针及其工作原理:

 int y = 5; int *p = &y; *p = 6; printf("%i\n", y); 

确保特别强调指针就像任何其他变量一样。 它存储一个内存地址。

目前还没有必要进入堆栈和堆。


数组指针+:

如何使用指针迭代数组:

 int x[10]; x[0] = 5; x[1] = 6; int *y = x; printf("%i\n", *y);//prints the first element y++; printf("%i\n", *y);//prints the second element 

然后你可以教更复杂的东西……

  • 如何做指针运算。
  • Array + i数组的简写[i]
  • 将数组传递给函数作为数组pointets vs pointer param + size param
  • 数组是如何连续的内存块
  • 解释字符串文字,缓冲区,……
  • sizeof如何使用指针与数组类型(指针大小与缓冲区大小)
  • 解释更复杂的概念,如分配内存, 堆栈和堆
  • 多级间接
  • 参考
  • 多维数组如何工作

在所有示例中,大量使用sizeof和打印地址。 了解正在发生的事情确实很有帮助。

我会先教指针。 可以在不教授数组的情况下解释它们 在教导数组时,我可以在解释表达式a[i]时引用指针,并在解释如何将它们传递给函数时。

不要过分思考。

尽可能清晰,有吸引力地教授这些概念远比你做它们的顺序更重要。

我建议先介绍一下数组的基础知识,然后再做一些指针和重新访问数组(这次更充分)。

您应该首先教授数组,因为它们几乎存在于任何其他语言中,并且更容易理解。 指针或指针的某些方面建立在有关数组的基础上。 这是有机秩序,imho,以及我在以后学习它的方式。

我假设你正在向那些已经知道如何用Java等其他语言编程的学生(或者我今天的Pascal)进行C语言教学。 我不认为C是一种很好的语言,可用于教授编程以完成新手。

我会先教指针。 这是将在C中学习的重要新想法之一。他们已经从其他语言中了解了数组的概念,因此没有必要先教这个。 所以当你用C语言覆盖数组时,你可以谈谈它们如何成为指针算术的语法糖,这是他们现在熟悉的概念。

他们应该同时被教导。

使用offset(typesize * index)作为指向base的指针访问的单维数组的示例应该是外观。

 a[i] is equivalent to *(a + i) 

在我担心数组之前,我教指针。 但是,通常情况下,我看到的学生,他们已经在其他语言的第一个CS课程中接触过数组。 然而,即使我在第一个CS类中教C,我也会在数组之前做指针并根据指针描述数组。 仅仅因为现在时尚人士认为“没有人会想要或者想知道计算机是如何工作的”并不意味着它是真的。

如上所述,我不认为订单很重要,但这是我希望有人向我展示这些东西的顺序。

  1. 数组
  2. 指针
  3. arrays和指针是如何相同的
  4. 为什么数组和指针不一样

有关第4点的更多信息,我真的建议第4章“令人震惊的事实:Carrays和指针不一样!” 在“专家C,深层C秘密”中。

/约翰


更新

这本书的一些链接,也有书的预览。 http://books.google.se – 专家C,深层C秘密

用户对本书的评论是真实的: http : //www.amazon.co.uk/Expert-Programming-Peter-van-Linden/dp/0131774298

如果他们事先接触过汇编程序,请先指教。

如果他们已经接触过更高级别的语言(即几乎任何东西),那么首先要教数组。

根据我的经验,人们来到C而没有接触到汇编级编程(寄存器,地址,“计算机基础”)即将进入一个痛苦的世界。 恕我直言,你实际上最好先教授汇编级编码,然后引入C作为更好的汇编程序。

有趣的问题 – 我希望现在回答还为时不晚。

当我在80年代早期在波士顿学院教授编程时,我和我的同事每年都在努力解决这些问题,我们不断调整我们的方法。 那时C是一种新语言,所以我们的进展从Basic到Pascal。 我记得当时认为教C很难,因为它更松散,有更多的方法可以让学生搞砸,更让人感到困惑的是像数组和指针这样的区别你要教的东西。

我发现最有用的是尝试具体而不是抽象。 例如,在介绍编程课程中,我使用了一个简单的十进制计算机的解释器,你可以用它的十进制“机器语言”编程。 它的地址从0到999,操作码如1234,“1”表示“添加到累加器”,“234”是找到要添加的数字的地址。 学生会编写非常简单的程序,比如添加一个数字列表,然后他们会单步执行,观察每一步发生的事情。

我会让他们玩这个约3周,然后开始进入BASIC。 在第二个课程中,他们将进入Pascal。 那个小小的“计算机”完成的是传达一些具体的概念,使“真实”语言中的“抽象”更容易理解,例如:

  • 什么内存,什么地址,以及数据和程序如何只是内存中地址的数字。 这使得“变量”,“数组”和“指针”的概念在以后更容易解释。
  • 计算的基本模型是如何按顺序执行非常简单的步骤,并且在每个步骤开始之前,前一个步骤必须完成。 我知道人们会反对计算机现在高度并行化和流水线化,但我必须解释一下你需要开始非常简单,因为当新手看到一个程序运行时,它会像所有人一样查找所有的东西,然后读取你的思想在这个过程中。
  • 如何通过组合一个非常小的指令词汇表,包括跳转和条件跳转,你可以让计算机做几乎你想要的任何事情。

现在,关于C,我听到它被贬低只是削减汇编语言,但我认为这是一件好事。 专家专家总是把它当成一种语言。 我认为如果你可以回访底层机器,那么数组,指针和结构的思想就很容易解释。 类似地,对于C ++和面向对象的编程。

因此,总而言之,如果学生理解计算机如何工作的基本概念,即使它是真正的人工计算机,那么解释更高级别的数据结构概念要容易得多。

取决于他们所知道的。 你在教C,还是编程和C?

我看到后者很少有成功。 C根本不是一种非常直观或宽容的语言。 虽然我看到学生们为编程而感到沮丧,但我还没有看到学生们开始感激不尽。

无论如何,那些将坚持编程的人将在业余时间外出学习C. 没有必要先把它推上去。

如果您只是在教C,并且他们已经知道指针和数组,那么可以在一节课中教授指针和数组如何在C中工作。

你会在字符串前教指针吗?

可能不是。 大多数相同的论点都适用。

(但一般我同意@legion – 不要过分思考它。)

我认为从数组开始会更好,因为数组的概念简单直观,但在C语言中,在教授思考之后重新访问数组是很重要的,正如之前提到的“军团”一样。

这个问题可以真正用于任何面向对象的语言。

当我被教授Java时,我首先展示了数组和指针,作为数组的最后一部分,以展示深拷贝和浅拷贝之间的区别。