>> [音乐播放]
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。