对于那些有课程开发经验的人:关于数组的最佳策略是什么?
我见过一些学校在变量和控制结构之后教授数组,通常甚至在教学功能之前。这允许教授一些基本的算法等。然而,它带来了如何将数组传递给函数的问题,因此有必要回到数组指针教授和补丁。
另一个选择是从变量和控制结构转到函数,然后教指针,一旦你有指针,从头开始教数组,然后用它来进行动态内存分配。
对我而言,第二个选项更有意义,因为与简单变量不同,使用数组很容易“超出范围”,但是尚未了解内存和指针的学生可能无法理解这些界限之外的内容。
但是,我很想知道其他人的想法。
答案 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)
如上所述,我不认为订单很重要, 但这是我希望有人向我展示这些东西的顺序。
有关第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时,我首先展示数组和指针,作为数组的最后一部分,以展示深拷贝和浅拷贝之间的区别。