1 00:00:00,000 --> 00:00:02,395 >> [音乐播放] 2 00:00:02,395 --> 00:00:05,750 3 00:00:05,750 --> 00:00:06,506 >> 道格·劳埃德:OK。 4 00:00:06,506 --> 00:00:08,880 我们已经与整数工作, 我们与人物的工作, 5 00:00:08,880 --> 00:00:11,930 我们已经工作的花车, 双打,字符串和布尔变量。 6 00:00:11,930 --> 00:00:14,870 我们已经用尽了几乎所有的 在[听不清]类型的 7 00:00:14,870 --> 00:00:17,100 已经提供给我们的所有沿。 8 00:00:17,100 --> 00:00:19,430 但是现在我们想要做的事情更多。 9 00:00:19,430 --> 00:00:20,210 我们该怎么做呢? 10 00:00:20,210 --> 00:00:22,560 我们如何创建不同类型的数据? 11 00:00:22,560 --> 00:00:26,130 我们可以通过使用结构这样做。 12 00:00:26,130 --> 00:00:30,180 所以结构使我们能够统一 不同类型的变量 13 00:00:30,180 --> 00:00:34,810 成一个单一的,新的变量类型, 我们可以将自己的类型名称。 14 00:00:34,810 --> 00:00:37,570 这是一个非常强大的 事情可以做, 15 00:00:37,570 --> 00:00:40,900 因为我们现在可以组 不同数据类型的要素 16 00:00:40,900 --> 00:00:43,910 一起具有一个逻辑连接。 17 00:00:43,910 --> 00:00:46,440 我们已经能够做到这一点 数组排序的,对不对? 18 00:00:46,440 --> 00:00:49,540 我们可以把变量 相同的数据类型的 19 00:00:49,540 --> 00:00:53,410 一起在一个大单位 的存储器,阵列。 20 00:00:53,410 --> 00:00:56,660 >> 但是,我们一直没能混 向上不同的数据类型一起。 21 00:00:56,660 --> 00:01:02,610 我们不能说,配对的整数, 和性格,和一个双所有 22 00:01:02,610 --> 00:01:05,330 在同样的事情, 称之为一个单元。 23 00:01:05,330 --> 00:01:08,830 但其结构,或 经常被称为结构, 24 00:01:08,830 --> 00:01:09,585 我们其实可以。 25 00:01:09,585 --> 00:01:12,370 因此,一个结构排序 像一个超级变量。 26 00:01:12,370 --> 00:01:16,530 它是一个包含一个可变 它里面的其他变量。 27 00:01:16,530 --> 00:01:19,650 所以这里有一个例子 一个非常简单的结构。 28 00:01:19,650 --> 00:01:23,380 这是语法将是什么 想创建一个结构的汽车。 29 00:01:23,380 --> 00:01:25,250 现在,让我们通过语法在这里。 30 00:01:25,250 --> 00:01:27,400 结构,这就是 关键字,指示 31 00:01:27,400 --> 00:01:30,270 我在这里创建一个新的数据类型。 32 00:01:30,270 --> 00:01:33,860 具体地,数据类型的名称是 将是结构的车,因为我们拭目以待。 33 00:01:33,860 --> 00:01:36,640 但是,这是尖的排序 关闭的编译器,这个 34 00:01:36,640 --> 00:01:42,440 作为一组变量,是要 到被认为是相同类型的一部分 35 00:01:42,440 --> 00:01:44,010 在一分钟内。 36 00:01:44,010 --> 00:01:46,340 >> 汽车,结构只是名字。 37 00:01:46,340 --> 00:01:50,590 同样,这里的数据类型将会 是结构的车,不只是汽车。 38 00:01:50,590 --> 00:01:53,060 但如果你有different-- 如果你创建多个结构 39 00:01:53,060 --> 00:01:56,950 在同一个程序,你需要 结构和结构加以区分。 40 00:01:56,950 --> 00:02:00,140 所以结构的车,我也可以 结构体的学生,例如 41 00:02:00,140 --> 00:02:01,790 在同一程序。 42 00:02:01,790 --> 00:02:05,980 里面的花括号是 所有的所谓场, 43 00:02:05,980 --> 00:02:07,954 或结构的成员。 44 00:02:07,954 --> 00:02:10,370 那么,什么是一些事情 中固有的一个车? 45 00:02:10,370 --> 00:02:15,270 那么,它通常有一个一年,已 一个型号名称,车牌, 46 00:02:15,270 --> 00:02:18,000 里程表,通常具有 一些数字就可以了哩, 47 00:02:18,000 --> 00:02:19,225 也许一个发动机尺寸。 48 00:02:19,225 --> 00:02:23,570 正如你所看到的,我是混合起来 整数和字符和双打。 49 00:02:23,570 --> 00:02:26,420 他们都将是 这个新的数据类型的一部分​​。 50 00:02:26,420 --> 00:02:29,750 >> 最后,最后一件事,我需要做的, 不要忘了这个小分号 51 00:02:29,750 --> 00:02:30,290 最后。 52 00:02:30,290 --> 00:02:34,380 我们完成定义结构之后, 我们需要把一个分号结尾。 53 00:02:34,380 --> 00:02:37,325 这是一个很常见的语法 错误,因为有一个功能, 54 00:02:37,325 --> 00:02:40,200 例如,你只是有 大括号,靠近大括号。 55 00:02:40,200 --> 00:02:42,950 你不把一个分号 函数定义的结束。 56 00:02:42,950 --> 00:02:46,430 这看起来像一个函数 定义,但它不是, 57 00:02:46,430 --> 00:02:49,653 所以分号有 只是提醒你 58 00:02:49,653 --> 00:02:52,440 需要把它放在那里,因为 编译器,否则将不 59 00:02:52,440 --> 00:02:53,510 知道该怎么办。 60 00:02:53,510 --> 00:02:56,160 这是一个非常常见的错误 意外使 61 00:02:56,160 --> 00:02:58,570 当你第一次定义结构。 62 00:02:58,570 --> 00:02:59,500 >> 好。 63 00:02:59,500 --> 00:03:02,824 所以,我们通常定义我们的结构 在我们的节目的最高层 64 00:03:02,824 --> 00:03:05,490 因为他们很可能会 要使用的多种功能。 65 00:03:05,490 --> 00:03:08,850 我们不希望定义一个 结构体在函数中, 66 00:03:08,850 --> 00:03:12,110 因为那时我们就可以only--的 结构的范围真的 67 00:03:12,110 --> 00:03:13,790 只存在该函数的内部。 68 00:03:13,790 --> 00:03:17,450 我们很可能要定义一个结构 所以我们可以在多个函数使用它, 69 00:03:17,450 --> 00:03:20,670 或者在多个 这是绑在一起的文件 70 00:03:20,670 --> 00:03:22,920 创建我们的一个程序。 71 00:03:22,920 --> 00:03:24,920 有时还代替 限定该结构的 72 00:03:24,920 --> 00:03:27,961 在最高层,你把你的 英镑包括和你一斤定义, 73 00:03:27,961 --> 00:03:32,080 例如,您可以把它们放在 单独的点.h文件,然后您再进行 74 00:03:32,080 --> 00:03:35,020 英镑包括你自己。 75 00:03:35,020 --> 00:03:37,620 >> 因此,我们有结构,但现在 我们需要让他们的内部。 76 00:03:37,620 --> 00:03:39,800 我们如何获得内部 一个结构来访问 77 00:03:39,800 --> 00:03:43,530 那些子的变量,这些变量 该结构内部存在? 78 00:03:43,530 --> 00:03:46,810 好了,我们有一些所谓 点运算符,这使我们 79 00:03:46,810 --> 00:03:50,990 访问结构的字段。 80 00:03:50,990 --> 00:03:55,490 因此,举例来说,假设我已经声明 我的结构化数据类型的地方 81 00:03:55,490 --> 00:03:59,020 在我的节目的顶部,或者在 我已经一斤点.h文件包括在内。 82 00:03:59,020 --> 00:04:03,360 如果我再要创建一个新的 该数据类型的变量,我可以说, 83 00:04:03,360 --> 00:04:06,260 结构的车,我的车,分号。 84 00:04:06,260 --> 00:04:11,580 就像我可以说INT x或字符串名称分号。 85 00:04:11,580 --> 00:04:18,100 >> 这里的数据类型是结构的车, 变量的名称是我的车, 86 00:04:18,100 --> 00:04:23,770 然后我可以使用点操作 访问我的车的各个领域。 87 00:04:23,770 --> 00:04:27,494 所以我可以说我的车 点的一年相当于2011。 88 00:04:27,494 --> 00:04:28,410 这是完全正常的。 89 00:04:28,410 --> 00:04:34,210 当年,如果你还记得,被定义为 这种结构车内整型字段 90 00:04:34,210 --> 00:04:35,200 数据类型。 91 00:04:35,200 --> 00:04:39,966 结构体的车的数据,所以任何变量 类型,如我的车,我可以说我的车 92 00:04:39,966 --> 00:04:44,030 点的一年相当于然后分配 它的一些整数值,2011。 93 00:04:44,030 --> 00:04:47,290 我的车点板等于CS50。 94 00:04:47,290 --> 00:04:51,180 我的卡点里程表 等于50505分号。 95 00:04:51,180 --> 00:04:53,270 所有这些都 完美的罚款,这就是 96 00:04:53,270 --> 00:04:57,802 我们如何访问 结构的领域。 97 00:04:57,802 --> 00:05:00,260 结构,但是,并不需要 要在堆栈上创建的。 98 00:05:00,260 --> 00:05:02,950 就像任何其他变量,我们 可以动态分配。 99 00:05:02,950 --> 00:05:06,309 如果我们有一个程序,可能 可以产生许多结构, 100 00:05:06,309 --> 00:05:08,100 我们不知道有多少 我们将需要, 101 00:05:08,100 --> 00:05:10,800 那么,我们需要动态 分配这些结构 102 00:05:10,800 --> 00:05:12,960 因为我们的程序正在运行。 103 00:05:12,960 --> 00:05:16,600 所以,如果我们要访问 的结构在该上下文字段, 104 00:05:16,600 --> 00:05:20,660 回想一下,我们首先需要提领 指针的结构中, 105 00:05:20,660 --> 00:05:24,810 再一次,我们取消引用 指针,那么我们就可以访问该字段。 106 00:05:24,810 --> 00:05:26,830 如果我们只有一个 指针的结构中, 107 00:05:26,830 --> 00:05:32,120 我们不能只说指针点域 命名并得到我们所要寻找的。 108 00:05:32,120 --> 00:05:34,259 有提领的额外步骤。 109 00:05:34,259 --> 00:05:36,050 因此,让我们说, 代替previous-- 110 00:05:36,050 --> 00:05:38,770 就像前面的例子, 代替它声明 111 00:05:38,770 --> 00:05:43,680 在栈中,结构的车,我 汽车,分号,我说的结构车, 112 00:05:43,680 --> 00:05:48,020 明星,一个指针 结构车叫我的车, 113 00:05:48,020 --> 00:05:51,250 等于结构的汽车malloc的大小。 114 00:05:51,250 --> 00:05:54,950 我们大小会找出多少 字节的新的数据类型占用。 115 00:05:54,950 --> 00:05:58,570 你不一定只需要使用 的,宽度,int或char或任何尺寸 116 00:05:58,570 --> 00:05:59,715 的内置的数据类型。 117 00:05:59,715 --> 00:06:02,090 编译器是足够聪明 找出多少字节 118 00:06:02,090 --> 00:06:04,170 需要通过新的结构。 119 00:06:04,170 --> 00:06:09,610 所以我自己的malloc的内存单元 大到足以容纳一个结构的汽车, 120 00:06:09,610 --> 00:06:12,410 我得到一个指针回 到存储器块, 121 00:06:12,410 --> 00:06:16,090 而该指针被分配给我的车。 122 00:06:16,090 --> 00:06:18,050 >> 现在,如果我想访问 我的车的领域, 123 00:06:18,050 --> 00:06:22,615 我第一次提领我的车使用 在引用操作,明星 124 00:06:22,615 --> 00:06:26,620 我们已经从指针可见 视频,然后我提领后, 125 00:06:26,620 --> 00:06:32,200 然后我可以使用点操作 访问我的车的各个领域。 126 00:06:32,200 --> 00:06:35,490 明星我的车点的一年相当于2011。 127 00:06:35,490 --> 00:06:38,480 这将有效果 我们希望在这种情况下, 128 00:06:38,480 --> 00:06:41,960 因为我们动态地已经 分配我的车。 129 00:06:41,960 --> 00:06:43,610 >> 这还算比较烦人,不过,对不对? 130 00:06:43,610 --> 00:06:44,818 有一个2步现在的过程。 131 00:06:44,818 --> 00:06:47,460 现在我们就来dereference-- 我们有一个星运营商, 132 00:06:47,460 --> 00:06:48,910 我们有一个点操作符。 133 00:06:48,910 --> 00:06:51,660 正如你所期望的,因为 C程序员喜欢短的方式 134 00:06:51,660 --> 00:06:53,740 做的事情,是有 更短的方式来做到这一点。 135 00:06:53,740 --> 00:06:57,790 还有另外一个操作员称为箭头 这使得这一过程变得更加简单。 136 00:06:57,790 --> 00:07:00,750 箭头的工作方式是 它首先解除引用 137 00:07:00,750 --> 00:07:03,560 左侧的指针 操作者侧, 138 00:07:03,560 --> 00:07:06,620 然后,在已经废弃 指针在左边, 139 00:07:06,620 --> 00:07:09,620 它访问领域的权利。 140 00:07:09,620 --> 00:07:14,170 所以,以前我们有这种 明星我的车点这一切的东西, 141 00:07:14,170 --> 00:07:15,880 就像有很多事情在那里。 142 00:07:15,880 --> 00:07:22,040 但是,我们可以做的,而不是为this-- 我的车箭年相当于2011。 143 00:07:22,040 --> 00:07:23,580 >> 同样,这里发生了什么? 144 00:07:23,580 --> 00:07:25,720 首先,我提领我的车。 145 00:07:25,720 --> 00:07:27,810 这再次,是这里的指针。 146 00:07:27,810 --> 00:07:31,270 然后,将具有后 废弃我的车,我 147 00:07:31,270 --> 00:07:35,130 然后可以访问域 今年,板和里程表 148 00:07:35,130 --> 00:07:40,020 只是尽我所能具有第一前 二手星级取消引用我的车, 149 00:07:40,020 --> 00:07:42,020 和斑点访问该字段。 150 00:07:42,020 --> 00:07:45,290 所以,你可以有结构,你 可以有指针结构, 151 00:07:45,290 --> 00:07:48,360 你有办法进入 这些结构的领域, 152 00:07:48,360 --> 00:07:52,600 你是否有指针 他们或变量本身。 153 00:07:52,600 --> 00:07:57,640 点或箭头,这取决于 变量是如何声明。 154 00:07:57,640 --> 00:08:00,510 我是道格·劳埃德,这是CS50。 155 00:08:00,510 --> 00:08:01,975