[音乐播放] DOUG LLOYD:好吧。 单工作 变量是蛮好玩的。 但是,如果我们想要什么工作 有很多变数, 但我们不希望有一堆 不同的名字到处乱飞我们的代码? 在这种情况下,数组是 要来非常方便。 数组是一个真正的基础数据 结构任何编程语言 你会使用。 他们是真的,真的很有用, 特别是,正如我们所看到的,在CS 50。 我们使用数组来保存 同一数据类型的值 在连续的存储单元。 这就是说,它是一个 这样我们就可以组 一堆整数在一起 内存或一串字符 或者在内存中漂浮真的 并拢工作 与他们,而不必给每个 它的一个自己独特的名称,它可以 获得过一小会儿繁琐。 现在,一种方式来类推阵列 是考虑当地邮局 办公室一秒钟。 因此,从编程一步之遥 而只是闭上眼睛 和可视化在你的心中 您当地的邮局。 通常,在大多数岗位 办公室,有一个大的银行 一个邮政信箱在墙上。 数组是一个巨大的块 连续内存, 相同的方式,一个邮件 在邮政银行 是在一个大的空间 墙上的邮局。 阵列被划分成小的, 相同的空间大小的块, 其中的每一个叫做一个元件,在 同样的方式,该职位的墙 办公室已经被划分成小的, 相同的空间大小的块, 我们称之为一个邮政信箱。 阵列的每个元素可以 存储一定量的数据, 就像每个邮政信箱能 持有一定量的邮件。 什么可以存储在的每个元素 该阵列是相同的数据的变量 类型,如int或字符,只 就像在你的邮政信箱, 你可以只适用的东西 相似类型的, 如字母或小包装。 最后,我们可以访问的每个元素 数组直接索引号, 正如我们可以访问我们的邮局 通过了解其邮箱号码框中。 我们希望,这个比喻 帮助你得到你的头 围绕阵列的想法 类比到别的 你可能 已经熟悉了。 在C语言中,数组的元素 索引从0开始,而不是从1。 这是非常重要的。 而事实上,这就是为什么我们在CS 50, 为什么计算机科学家频繁 会从0计数,是 因为C的数组 索引,它总是从0开始。 因此,如果一个数组由n个元素, 该数组的第一元素 位于索引0, 所述阵列的最后一个元素 位于索引n减去1。 此外,如果有n个元素我们 阵,最后的指数为n减1。 所以,如果我们的阵列有50个元素,在 第一元件被设在索引0, 和最后一个元素 位于指数49。 遗憾的是,还是幸运的是, 这取决于你的观点, C是非常宽松这里。 它不会阻止你 走出去阵列的界限。 你可以访问减 你的数组的三要素 或者你的数组的第59件, 如果你的数组只有50个元素。 它不会停止你的程序 编译,但在运行时, 你可能会遇到一个 可怕的分段错误 如果你开始访问内存 这是一个什么样的边界之外 你问你的程序给你。 所以千万要小心。 什么数组 声明是什么样子? 我们如何编写一个数组存在 就像我们代码的任何其他变量? 有三个部分到一个数组 declaration--一个类型,名称, 和一个大小。 这是非常相似的一个 变量声明,这 仅仅是一个类型和名称, 大小元素是 的特殊情况为阵列, 因为我们已经看到了一群人 与此同时。 因此,类型是什么样的变化,你 希望成为该阵列的每个元素。 不要希望它整数数组? 然后,你的数据类型应该是int。 你希望它是一个 双打或浮筒的阵列? 数据类型应该是双重或浮动。 这个名字就是你 想打电话给你的阵列。 你想命名这个巨人 整数或浮点数或字符银行 还是双打,或任何有你吗? 那你怎么称呼它? 漂亮的自我解释。 最后,大小,它进入 方括号内, 多少个元素是你会 喜欢你的阵列遏制。 多少个整数,你要不要? 多少花车你想要什么? 因此,例如,诠释学生成绩40。 该声明呼吁学生数组 等级,其中包括40的整数。 漂亮的自我解释,我希望。 这里是另外一个例子。 双菜单上的价格8。 这将创建称为阵列 菜单上的价格,其中包括 房间在内存中为八对双打。 如果你觉得每一个元素 类型的数据类型的阵列, 因此,例如,一个单一的元素 int类型的数组,相同的方式, 会想到其他 int类型的变量, 所有熟悉的操作,我们 在操作前面讨论 视频将是有意义的。 所以在这里,我们可以声明数组 布尔叫Truthtable的, 其中包括空间10布尔值。 然后,就像我们可以只分配 一个值类型的任何其它可变 布尔,我们可以说些什么 像Truthtable括号 2,这是我们如何表示, 该真值表的元素? 的第三个要素 真值表,因为记得, 我们计数为0。 所以,这就是我们如何指示 真值表的第三个要素。 Truthtable 2等于假, 就像我们可以declare-- 或者我们可以指定,相反,任何 布尔类型变量是假的。 我们也可以用它的条件。 如果(truthtable 7 == 真),这是说, 如果第八元素 Truthtable是真实的, 也许我们要打印一个信息 给用户,输出(“真!N”); 这使我们说Truthtable 10等于真的吧? 好吧,我可以,但它是相当 危险的,因为记得, 我们有10布尔数组。 所以指数最高的 编译器已经给我们的是9。 这一计划将编译,但 如果其他内存 存在在那里我们将 预计Truthtable 10去, 我们可能遭受分割故障。我们 可能逃脱它,但在一般情况下, 相当危险。 所以,我在这里做是合法的C, 但不一定是最好的举措。 现在,当你声明和 同时初始化一个数组, 实际上有一个漂亮 特殊的语法,您 可以用它来填满阵列 它的开始值。 它可以变得很麻烦 申报大小100的阵列, 然后不得不说,元素0 等于这一点;元1等于这一点; 单元2等于这一点。 这有什么意义,不是吗? 如果它是一个小阵,你 可以做这样的事情。 布尔truthtable 3等于开 大括号,然后逗号 分离元素列表 你想要把数组中开始。 然后关闭大括号分号。 这产生的阵列 大小的3名为Truthtable, 与元素假的,真实的,真实的。 而事实上,所述实例化 语法我这里是 完全一样做 下面的各个元素语法。 编码的这两种方式将 产生完全相同的阵列。 同样的,我们可以遍历 以上所有的元素 使用循环的阵列,其中,在 事实上,是一个非常强烈推荐 在家里锻炼。 你如何创建一个数组 的100个整数,其中 数组中的每一个元素是其指数? 因此,例如,我们有100阵列 整数,并且在第一元件, 我们希望把0。 在第二个元素,我们希望把1。 在第三个元素,我们希望 把2;等等等等。 这是一个非常好的 在家里练习做。 在这里,它不看 喜欢太多改变。 但是请注意,在之间 方括号中,这一次, 其实我已经省略了一些。 如果你使用这个非常 特殊实例 语法创建 数组,你居然不 需要指出的大小 阵列的预先。 编译器是足够聪明 要知道,你其实 希望大小3的阵列, 因为你把三个要素 等号的右边。 如果你已经把四,那就得 给你的尺码4的真值表; 等等等等。 数组不局限于单一 维度,这是很酷。 实际上,你可以有很多 侧面说明符如你所愿。 因此,举例来说,如果你想创建 董事会为游戏战舰,其中, 如果你玩过,是一种游戏,是 10格玩弄于10钉, 你可以创建一个这样的数组。 你可以说布尔 战舰括号10 封闭括号广场 支架10关闭方括号。 然后,你可以选择 在你的心中解释为一个10 10网格单元。 现在,实际上,在存储器中 它确实只是 仍然是100元, 一维阵列。 而这,其实也适用于你 有三个维度,四个或五个。 这真的只是不乘 所有的indices--的 或所有的大小 specifiers--在一起, 而你只得到一个一维 数组的大小。 但在组织方面和 可视化和人类感知, 它可以是一个容易得多 用电网工作 如果你工作在一个游戏 像井字棋或战舰, 或类似的东西。 这是一个伟大的抽象, 代替具有 想想一个井字棋 板作为线九 广场或战舰板 作为一行的100个正方形。 10×10格或三 通过三格可能 很多更容易察觉。 现在,一些真正 重要的有关数组。 我们可以把每一个人 数组作为可变的元件。 我们看到,前面 当我们分配 真值一定布尔 或者测试他们的条件句。 但是,我们不能把整个 数组本身作为变量。 我们不能,例如,分配一个阵列 使用分配另一个数组 运营商。 这是不合法的C. 如果我们想,对于example--什么 我们会做的那个例子 将复制一个阵列到另一个。 如果我们要做到这一点,我们实际上 需要使用一个循环来拷贝过来 每个单独的元件一次一个。 我知道这是一个有点费时。 因此,例如,如果我们有这些夫妇 行的代码,将这项工作? 哦,不,它不会,对不对? 因为我们正在努力 粮食分配给吧。 这是行不通的, 因为它是一个数组, 而我们刚才所描述 这,这不是法律C. 相反,如果我们希望 复制食物的内容 进入酒吧,这是什么 我们想在这里做, 我们需要这样的语法。 我们有一个for循环去 从J是等于0到5, 我们增加J于每一个迭代 循环,这样分配的元素。 这将导致酒吧还 是一,二,三,四,五, 但我们必须这样做,这很 慢元素乘元素的方式, 而不是由跟 复制整个阵列。 在其他编程 语言,更现代的, 你可以,事实上,做到这 这么简单等于语法。 但是,C,不幸的是,我们 不允许这样做。 现在,有一个其他 的事情,我要提 有关阵列可以是一个小 有些棘手的第一次 与他们合作。 我们在视频中讨论 有关变量的作用域, 大多数变量在C中,当你调用 它们的功能,是按值传递。 你还记得这是什么意思 通过一些由价值? 这意味着我们正在做的一个副本 这正在被传递的变量。 被调用函数,该函数 该真实接收变量, 没有得到变量本身。 它得到了自己的地方 它的副本一起工作。 当然,数组,做 不遵循这个规则。 相反,我们所说的这个 是通过引用传递。 实际上被调用者 确实接收阵列。 它不接收其 它自己的本地副本。 如果你想 它,这是有道理的。 如果数组是真的很大, 需要这么多的时间和精力 使阵列的一个拷贝 100或1000或10,000元, 这是不值得的 函数接收的一个副本, 做一些工作吧,然后 只是在复印完成; 它并不需要有 它游逛了。 因为数组是一些 笨重,麻烦且 我们只是通过引用传递。 我们只相信功能 要,不要破坏任何东西。 因此,它实际获得的数组。 它没有得到它自己的本地副本。 所以,这是什么意思, 然后,在被叫时 操纵数组中的元素? 会发生什么? 现在,我们将光泽 在到底为什么这 发生,为什么数组 按引用传递 和其他一切是按值传递。 但我向你保证,我们将 返回并给你答案 此在后面的视频。 这里有一个多运动对你 之前,我们总结了东西阵列。 这里的代码串,这是 不是特别的好作风, 只是我会作出这样的警告。 有没有意见在这里, 这是非常不好的形式。 但是,这只是因为我想成为 能够在屏幕上容纳一切。 在顶部,你可以看到,我有 二元函数声明为一组阵列 并设置INT。 设置阵列显然需要一个数组 四个整数作为它的输入。 并设置INT显然需要 一个整数作为其输入。 但他们都没有输出。 输出,返回 类型,每一个都是无效的。 在主,我们有一个 几行代码。 我们声明一个整数变量 称为A和分配值10。 我们申报的四个整数数组 称为B并分配元件0,1 2,和3中。 然后,我们有一个调用设置 int和调用设置阵列。 集阵列和组的定义 INT是向下跌破,在底部。 所以,再一次,我问你的问题。 什么被打印出来 在这里主要的结束? 有一个打印山坳。我 打印出两个整数。 我打印出A的内容和 的乙括号0的内容。 在这里暂停视频,并采取一分钟。 你能弄清楚这是什么 功能将在最后打印? 我们希望,如果你还记得 路过的价值之间的区别 并引用传递,这 问题是不是太棘手的适合你。 而答案,你会 发现是这样的。 如果你真的不知道,以 为什么是这样的话,拿第二, 回去后,我回顾了一下刚才 讨论有关传递数组 作为参考,与传递 其他变量按值, 并希望,它会让 多一点点感觉。 我是道格·劳埃德,这是CS50。