>> [音乐播放]
>> 道格·劳埃德：OK。
我们已经与整数工作， 我们与人物的工作，
我们已经工作的花车， 双打，字符串和布尔变量。
我们已经用尽了几乎所有的 在[听不清]类型的
已经提供给我们的所有沿。
但是现在我们想要做的事情更多。
我们该怎么做呢？
我们如何创建不同类型的数据？
我们可以通过使用结构这样做。
所以结构使我们能够统一 不同类型的变量
成一个单一的，新的变量类型， 我们可以将自己的类型名称。
这是一个非常强大的 事情可以做，
因为我们现在可以组 不同数据类型的要素
一起具有一个逻辑连接。
我们已经能够做到这一点 数组排序的，对不对？
我们可以把变量 相同的数据类型的
一起在一个大单位 的存储器，阵列。
>> 但是，我们一直没能混 向上不同的数据类型一起。
我们不能说，配对的整数， 和性格，和一个双所有
在同样的事情， 称之为一个单元。
但其结构，或 经常被称为结构，
我们其实可以。
因此，一个结构排序 像一个超级变量。
它是一个包含一个可变 它里面的其他变量。
所以这里有一个例子 一个非常简单的结构。
这是语法将是什么 想创建一个结构的汽车。
现在，让我们通过语法在这里。
结构，这就是 关键字，指示
我在这里创建一个新的数据类型。
具体地，数据类型的名称是 将是结构的车，因为我们拭目以待。
但是，这是尖的排序 关闭的编译器，这个
作为一组变量，是要 到被认为是相同类型的一部分
在一分钟内。
>> 汽车，结构只是名字。
同样，这里的数据类型将会 是结构的车，不只是汽车。
但如果你有different-- 如果你创建多个结构
在同一个程序，你需要 结构和结构加以区分。
所以结构的车，我也可以 结构体的学生，例如
在同一程序。
里面的花括号是 所有的所谓场，
或结构的成员。
那么，什么是一些事情 中固有的一个车？
那么，它通常有一个一年，已 一个型号名称，车牌，
里程表，通常具有 一些数字就可以了哩，
也许一个发动机尺寸。
正如你所看到的，我是混合起来 整数和字符和双打。
他们都将是 这个新的数据类型的一部分​​。
>> 最后，最后一件事，我需要做的， 不要忘了这个小分号
最后。
我们完成定义结构之后， 我们需要把一个分号结尾。
这是一个很常见的语法 错误，因为有一个功能，
例如，你只是有 大括号，靠近大括号。
你不把一个分号 函数定义的结束。
这看起来像一个函数 定义，但它不是，
所以分号有 只是提醒你
需要把它放在那里，因为 编译器，否则将不
知道该怎么办。
这是一个非常常见的错误 意外使
当你第一次定义结构。
>> 好。
所以，我们通常定义我们的结构 在我们的节目的最高层
因为他们很可能会 要使用的多种功能。
我们不希望定义一个 结构体在函数中，
因为那时我们就可以only--的 结构的范围真的
只存在该函数的内部。
我们很可能要定义一个结构 所以我们可以在多个函数使用它，
或者在多个 这是绑在一起的文件
创建我们的一个程序。
有时还代替 限定该结构的
在最高层，你把你的 英镑包括和你一斤定义，
例如，您可以把它们放在 单独的点.h文件，然后您再进行
英镑包括你自己。
>> 因此，我们有结构，但现在 我们需要让他们的内部。
我们如何获得内部 一个结构来访问
那些子的变量，这些变量 该结构内部存在？
好了，我们有一些所谓 点运算符，这使我们
访问结构的字段。
因此，举例来说，假设我已经声明 我的结构化数据类型的地方
在我的节目的顶部，或者在 我已经一斤点.h文件包括在内。
如果我再要创建一个新的 该数据类型的变量，我可以说，
结构的车，我的车，分号。
就像我可以说INT x或字符串名称分号。
>> 这里的数据类型是结构的车， 变量的名称是我的车，
然后我可以使用点操作 访问我的车的各个领域。
所以我可以说我的车 点的一年相当于2011。
这是完全正常的。
当年，如果你还记得，被定义为 这种结构车内整型字段
数据类型。
结构体的车的数据，所以任何变量 类型，如我的车，我可以说我的车
点的一年相当于然后分配 它的一些整数值，2011。
我的车点板等于CS50。
我的卡点里程表 等于50505分号。
所有这些都 完美的罚款，这就是
我们如何访问 结构的领域。
结构，但是，并不需要 要在堆栈上创建的。
就像任何其他变量，我们 可以动态分配。
如果我们有一个程序，可能 可以产生许多结构，
我们不知道有多少 我们将需要，
那么，我们需要动态 分配这些结构
因为我们的程序正在运行。
所以，如果我们要访问 的结构在该上下文字段，
回想一下，我们首先需要提领 指针的结构中，
再一次，我们取消引用 指针，那么我们就可以访问该字段。
如果我们只有一个 指针的结构中，
我们不能只说指针点域 命名并得到我们所要寻找的。
有提领的额外步骤。
因此，让我们说， 代替previous--
就像前面的例子， 代替它声明
在栈中，结构的车，我 汽车，分号，我说的结构车，
明星，一个指针 结构车叫我的车，
等于结构的汽车malloc的大小。
我们大小会找出多少 字节的新的数据类型占用。
你不一定只需要使用 的，宽度，int或char或任何尺寸
的内置的数据类型。
编译器是足够聪明 找出多少字节
需要通过新的结构。
所以我自己的malloc的内存单元 大到足以容纳一个结构的汽车，
我得到一个指针回 到存储器块，
而该指针被分配给我的车。
>> 现在，如果我想访问 我的车的领域，
我第一次提领我的车使用 在引用操作，明星
我们已经从指针可见 视频，然后我提领后，
然后我可以使用点操作 访问我的车的各个领域。
明星我的车点的一年相当于2011。
这将有效果 我们希望在这种情况下，
因为我们动态地已经 分配我的车。
>> 这还算比较烦人，不过，对不对？
有一个2步现在的过程。
现在我们就来dereference-- 我们有一个星运营商，
我们有一个点操作符。
正如你所期望的，因为 C程序员喜欢短的方式
做的事情，是有 更短的方式来做到这一点。
还有另外一个操作员称为箭头 这使得这一过程变得更加简单。
箭头的工作方式是 它首先解除引用
左侧的指针 操作者侧，
然后，在已经废弃 指针在左边，
它访问领域的权利。
所以，以前我们有这种 明星我的车点这一切的东西，
就像有很多事情在那里。
但是，我们可以做的，而不是为this-- 我的车箭年相当于2011。
>> 同样，这里发生了什么？
首先，我提领我的车。
这再次，是这里的指针。
然后，将具有后 废弃我的车，我
然后可以访问域 今年，板和里程表
只是尽我所能具有第一前 二手星级取消引用我的车，
和斑点访问该字段。
所以，你可以有结构，你 可以有指针结构，
你有办法进入 这些结构的领域，
你是否有指针 他们或变量本身。
点或箭头，这取决于 变量是如何声明。
我是道格·劳埃德，这是CS50。