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

时间:2009-03-22 00:51:00

标签: c arrays pointers

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

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

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

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

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

14 个答案:

答案 0 :(得分:34)

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

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


<强>阵列

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

//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

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

在所有示例中大量使用sizeof和打印地址。这真的有助于了解正在发生的事情。

答案 1 :(得分:9)

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

答案 2 :(得分:8)

不要过度思考。

尽可能清晰,有说服力地教授这些概念,远比你的命令更重要。

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

答案 3 :(得分:8)

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

答案 4 :(得分:2)

他们应该同时上课。

作为指向具有offset(typesize * index)的基础的指针访问的单维数组的示例应该出现。

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

答案 5 :(得分:2)

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

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

答案 6 :(得分:2)

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

答案 7 :(得分:1)

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

  1. 阵列
  2. 指针
  3. 阵列和指针是如何相同的
  4. 为什么数组和指针不一样
  5. 有关第4点的更多信息,我真的推荐第4章 “令人震惊的事实:C阵列和指针不一样!”在“专家C,深层C秘密”中。

    /约翰


    <强>更新

    该书的一些链接,还有该书的预览。 http://books.google.se - Expert C, deep C secrets

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

答案 8 :(得分:1)

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

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

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

答案 9 :(得分:1)

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

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

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

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

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

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

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

答案 10 :(得分:0)

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

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

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

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

答案 11 :(得分:0)

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

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

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

答案 12 :(得分:0)

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

答案 13 :(得分:0)

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

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