[Powered by Google Translate] 让我们谈论阵列。 那么,为什么我们要使用阵列吗? 那么让我们说你有一个程序,需要存储5个学生证。 这可能似乎是合理的,有5个独立的变量。 我们会看到在一个位的原因,我们会从0开始计数。 的变量,我们就必须将int ID0,诠释ID1,等等。 我们想要执行的任何逻辑上学生证需要进行复制和粘贴 这些学生的ID。 如果我们要检查学生发生在CS50, 我们首先需要检查,如果ID0代表学生的过程中。 然后做同样的学生,我们需要的代码复制并粘贴ID0 替换所有出现ID0 ID1等ID2,3和4。 只要你听到了,我们需要复制和粘贴, 你应该开始想有一个更好的解决方案。 现在,如果你知道你不需要5个学生证,而是7? 您需要返回到源代码中添加一个ID5,ID6, 复制并粘贴的逻辑检查,如果属于这2个新的ID类的ID。 有没有所有这些ID连接在一起,所以是没有办法的要求 程序做到这一点的ID 0到6。 现在好了,你知道你有100个学生证。 它开始似乎不太理想,需要单独声明这些ID, 复制并粘贴这些新的ID任何逻辑。 但是也许我们有决心,我们做的所有100名学生。 但是,如果你不知道有多少学生实际上是什么? 只是一些有n个学生,你的程序有问什么,n是用户。 嗯哦。这是行不通的,非常好。 你的程序只适用于一些固定数量的学生。 解决所有这些问题,是美丽的数组。 那么,什么是数组? 在一些编程语言中数组类型可能是能多做一点, 但在这里,我们将重点放在数组的基本数据结构,就像你会看到它在C. 数组是一个大的内存块。就是这样。 当我们说我们有10个整数的数组,这只是意味着我们有一些块 的内存是大到足以容纳10个独立的整数。 假设一个整数是4个字节,这意味着有10个整数的数组 是一个连续的块的40个字节在内存中。 即使当您使用多维数组,我们不会在这里, 它仍然只是一个大的内存块。 多维符号只是为了方便。 如果你有一个3×3的多维数组的整数, 那么你的程序会真的只是把这个作为一个大的块36个字节。 整数的总数是3次3,和每个整数占用4个字节。 让我们来看看一个基本的例子。 在这里我们可以看到两种不同的方式声明数组。 我们不得不评论1编译的程序 因为我们声明x的两倍。 我们就来看看一些之间的差异,这2种类型的声明中位。 这些线路都声明一个数组的大小为N, 在这里我们定义N为10。 我们可以要求用户为一正整数 及使用上,作为我们的数组中的元素数目的整数。 像我们的学生ID的例子之前,这是一种像宣布10完全独立的 虚变量; X0,X1,x2和等xN的-1。 忽略我们声明数组的行,注意方括号不变 在fo​​r循环内。 当我们写的东西,比如x [3],我只是读为x支架3, 你能想到它是这样要求的虚X3。 比与大小为N的括号内的数目,这意味着,一个数组的通知 我们称之为索引,可以是任何东西,从0到N-1, 这是一个总的N个索引。 要想想如何实际工作 请记住,数组是一个大的内存块。 假设一个整数是4个字节,整个数组x是一个40字节的内存块。 所以,X0是指非常的块的第一个4字节。 X [1]是指在接下来的4个字节,等等。 这就是说,开始的x是所有的程序都需要来跟踪。 如果你想使用x [400],然后程序就知道,这相当于 后仅1600字节x的开始。 在哪里,我们得到1600个字节?这是只有400次4个字节的整数。 在继续之前,它是非常重要的实现,在C 在阵列中使用的索引,我们没有强制执行。 我们的大的块是只有10个整数长,但绝对不会骂我们,如果我们写X [20] 甚至是X [-5]。 该指数甚至不必须是一个数字。 它可以是任意表达式。 在该方案中,我们使用变量i的循环索引数组。 这是一个非常常见的模式,循环从i = 0到该阵列的长度, 然后使用i作为指数为阵列。 这样你整个阵列的有效循环, ,你可以指定数组中的每一个点,或者用它来进行一些计算。 在第一个for循环中,我从0开始, 所以它会分配到0点的数组中的值0次2。 然后,我的增量,和我们指定的第一点在数组中的值1倍,2。 然后,我的增量再等等,直到我们就到了指定的位置N-1阵列中的 值N-1倍,2。 因此,我们创建了一个数组的第一个10个偶数。 也许埃文斯会是一个更好的变量名比x, 但这样做东西拿走。 第二个for循环,只打印出的价值,我们已经存放在里面的数组。 让我们尝试运行的程序与这两种类型的数组声明 看看该程序的输出。 据我们可以看到,程序的行为同样的方式为两种类型的声明。 让我们也来看看会发生什么,如果我们改变了第一循环不停止在N 而是说10,000元。 超出了数组末尾的途径。 哎呀。也许你已经看到了这一点。 一个分割错误意味着你的程序崩溃。 你会开始看到这些,当你触摸你不应该接触的内存区域。 在这里,我们都在触摸开始的X超过一万个名额, 这显然​​是在内存中,我们不应该接触的地方。 所以,我们大多数人可能会不小心把10,000,而不是N, 但如果我们做一些更微妙的像说写小于或等于N 在fo​​r循环中的条件,而不是小于N。 请记住,一个数组只具有从0到N-1的索引, 这意味着,索引N超出阵列的结尾。 在这种情况下,该程序可能不会崩溃,但它仍然是一个错误。 其实,这个错误是很常见的,它有它的自己的名字, 关闭1个错误。 这是它的基本知识。 那么,什么是2种类型的数组声明的主要区别? 一个区别是大的内存块。 在第一个声​​明,我会打电话给支架数组类型, 虽然这绝不是以往的名称, 它会在栈上。 而在第二,我会打电话给指针数组类型,它会在堆上。 这意味着,当函数返回时,支架阵列会自动被释放, 而你必须explicitily拨打免费的指针数组 否则,你有内存泄漏。 此外,在托架阵列实际上是不是一个变量。 这是很重要的。这只是一个符号。 你可以认为它是一个常量,编译器供您选择。 这意味着,我们不能做什么,比如x + +的支架类型, 虽然这是完全合法的指针类型。 指针类型是一个变量。 对于指针类型,我们有2个独立的内存块。 该变量x自身被存储在堆栈中,并只是一个单一的指针, 但大的内存块存储在堆中。 只是存储在堆栈中的变量x的地址 大的堆内存块。 这方面的一个含义是与运营商的规模。 如果你问的支架数组的大小,它会给你的大内存块的大小, 像40字节, 但如果你问的指针类型的数组的大小, 它会给你变量x本身,而在设备上可能只有4个字节的大小。 使用指针数组类型,它是不​​可能直接要求 大的内存块的大小。 这是没多大的限制,因为我们很少想的大小 大的内存块,如果我们需要的话,我们通常可以计算出它。 最后,支架阵列恰好为我们提供的快捷方式初始化数组。 让我们看看我们如何可以写第一个使用快捷键在实例10个偶数。 指针数组,有没有一种方法可以做到这样的快捷方式。 这仅仅是你可以做什么与阵列的介绍。 他们出现在几乎每一个程序,你写的。 希望你现在可以看到一个更好的方式做学生证的例子 从一开始的视频。 我的名字是罗布·波顿,这是CS50。