[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。