English 中文(简体)
当教学C,它是更好的教数组指针之前或之后吗?(关闭)
原标题:
  • 时间:2009-03-22 00:50:59
  •  标签:
Closed. This question is opinion-based. It is not currently accepting answers.

< b >想改善这个问题?< / b >更新问题,因此它可以回答的事实和引用< a href = " /文章/ 670353 /编辑”>编辑这篇文章< / >。

Closed 6 years ago.

与课程开发的经验:关于数组最好的策略是什么?

我见过一些学校教数组变量和控制结构后,常常甚至教学功能。这使得教学的一些基本算法等等。然而,然后将如何将数组传递给函数的问题,所以有必要回到数组指针被教导和补丁。

另一个选择是从变量和控制结构函数,然后教指针,指针后,从头教数组,然后使用动态内存分配。

给我第二个选择更有意义,因为与简单的变量,数组是容易“越界”,但学生尚未学习记忆和指针可能不理解在这些范围之外。

但是,我想知道别人怎么想。

最佳回答

我认为最好的方法是引入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
", y);

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

不需要进入堆栈和堆。


<强>阵列+指针:< /强>

如何遍历与指针数组:

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

<强>你可以教更多复杂的事情…< /强>

在所有例子使大量使用sizeof和打印地址。能帮助你真正的理解什么年代。

问题回答

我会先教指针。他们可以解释教学数组。我在教学过程中数组可以引用指针当解释表达式<代码>[我]> < /代码,当解释他们能通过一个函数。

不深思的事情。

这些概念教学尽可能清晰而动人地远比你订单做什么更重要。

我建议首先涉及基本的数组,和做指针和回顾数组(这次更充分地)。

你应该先教数组,因为他们几乎存在于任何其他语言,和更容易理解。指针的指针,或者一些方面,建立在数组中所学到的一切。这是有机秩序,恕我直言,我学会了如何当。

我假设你是教C的学生已经知道如何在另一种语言,像Java程序(或在我的天,帕斯卡)。我不认为C是一个很好的语言教学使用编程完成新手。

我会先教指针。这是其中一个重要的新思想,这将在c,他们将学习从其他语言已经知道数组的概念,首先教这个年代没有紧迫感。所以当你做封面用C数组,你可以谈论他们如何为指针算法本质上是语法糖,他们现在熟悉的概念。

他们应该教在同一时间。

一维数组的例子作为指针访问用抵消固定在底座(typesize *指数)应该露面。

即。

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

我担心之前教指针数组。然而,通常情况下,学生我看到,他们已经暴露于数组首先CS类在其他语言。然而,即使我是教学第C C类,我之前做指针数组和描述数组的指针。只是这些天,因为它是时尚认为“没有人会需要或想知道电脑是如何工作”并不意味着它年代真实的。

As stated above I don t think the order is important, but this is the order I wished someone would have showed me the stuff.

  1. Arrays
  2. Pointers
  3. How Arrays and Pointers are the same
  4. Why Arrays and Pointers are NOT the same

For more info on point 4 I really recommend chapter 4 "The Shocking truth: C arrays and Pointers Are NOT the Same!" in "Expert C, deep C secrets".

/Johan


<强> < /强>更新:

Some links to the book, and there is also a preview of the book. http://books.google.se - Expert C, deep C secrets

And the user comments about this book is true: http://www.amazon.co.uk/Expert-Programming-Peter-van-Linden/dp/0131774298

如果他们事先已经暴露在汇编程序,先教指针。

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

根据我的经验,在没有接触过汇编级编程(寄存器、地址、“计算机基础知识”)的情况下学习C的人即将进入一个痛苦的世界。IMHO实际上,你最好先教授汇编级编码,然后引入C作为更好的汇编程序。

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

80年代初,当我在波士顿学院教授编程时,我和同事们每年都在努力解决这些问题,我们一直在调整我们的方法。当时C语言是一种新语言,所以我们从Basic语言发展到Pascal语言。我记得当时我在想,仅仅因为C语言更松散,学生有更多的方法搞砸,以及更令人困惑的事情,比如你必须教的数组和指针之间的区别,教它会有多困难。

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

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

  • What memory is, and what addresses are, and how both data and programs are just numbers at addresses in memory. That makes the concept of "variable" and "array" and "pointer" much easier to explain later.
  • How the basic model of computation is that very simple steps are performed in sequence, and before each step can begin, the previous one has to finish. I know people will object that computers are highly parallelized and pipelined nowadays, but I have to explain that you need to start really simple, because when newbies see a program run, it looks for all the world like it does everything at once, and reads your mind in the process.
  • How, by combining a very small vocabulary of instructions, including jumps and conditional jumps, you can get the computer to do almost anything you want it to.

现在,关于C,我听说它被贬低为只是汇编语言之上的一个分支,但我认为这是一件好事。它总是让我觉得是专家对专家的一种语言。我认为数组、指针和结构的概念很容易解释,如果你可以参考底层机器的话。与C++和面向对象编程类似。

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

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

我看到后者几乎没有成功。C语言不是一种非常直观或宽容的语言。我没有看到学生们因为开始使用它而心存感激,尽管我看到学生们对它的编程感到沮丧。

无论如何,那些坚持编程的人会在业余时间出去学习C语言。没有必要先把它推到他们身上。

如果你只是在教C,而他们已经知道指针和数组,那么教指针和数组如何在C中工作可以在一节课上完成。

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

可能不会。大多数相同的论点也适用。

(但总的来说,我同意@legion的观点——不要想得太多。)

我认为最好从数组开始,因为数组的概念简单直观,但在C语言中,正如Legion之前所建议的那样,在教授ponters之后重新访问数组是很重要的。

任何面向对象的语言都可以问这个问题。

当我学习Java时,首先向我展示了数组和指针,作为数组的最后一部分,以演示深度复制和浅层复制之间的区别。





相关问题
热门标签