1 00:00:00,000 --> 00:00:01,110 >> [音乐播放] 2 00:00:01,110 --> 00:00:10,567 3 00:00:10,567 --> 00:00:11,650 戴维·J·马兰:好吧。 4 00:00:11,650 --> 00:00:15,610 这是CS50,这 是第四周的结束。 5 00:00:15,610 --> 00:00:19,420 今天的话题之一 是数字取证的, 6 00:00:19,420 --> 00:00:20,989 艺术恢复信息。 7 00:00:20,989 --> 00:00:22,780 事实上,即使 你在中间 8 00:00:22,780 --> 00:00:25,070 现在和平就在三 和突围,下周, 9 00:00:25,070 --> 00:00:27,880 重点将放在 正是这个领域。 10 00:00:27,880 --> 00:00:30,686 >> 因此,最酷的工作之一,我曾经 不得不回来读研究生, 11 00:00:30,686 --> 00:00:33,560 当我工作的地方 米德尔塞克斯县地区检察官 12 00:00:33,560 --> 00:00:34,950 办公,做取证工作。 13 00:00:34,950 --> 00:00:37,450 所以基本上,马萨诸塞州 国家警察,有时, 14 00:00:37,450 --> 00:00:40,100 在案件工作时,会 带来的东西像硬盘驱动器 15 00:00:40,100 --> 00:00:42,185 和软盘和 存储卡等。 16 00:00:42,185 --> 00:00:44,060 他们会交给他们 我和我的导师, 17 00:00:44,060 --> 00:00:48,070 我们的目标是要找到证据, 如果有可能对这些媒体。 18 00:00:48,070 --> 00:00:50,700 现在,你可能已经看到一瞥 这个世界取证的 19 00:00:50,700 --> 00:00:53,000 在媒体,电视和电影。 20 00:00:53,000 --> 00:00:55,730 但这份工作,我曾和 敢说这世界上, 21 00:00:55,730 --> 00:00:57,550 是不是很喜欢,你会看到它。 22 00:00:57,550 --> 00:01:00,794 让我们来看看有哪些 你可能已经看到了。 23 00:01:00,794 --> 00:01:01,460 [视频回放] 24 00:01:01,460 --> 00:01:02,930 - 确定。 25 00:01:02,930 --> 00:01:05,380 现在,让我们好好看看你。 26 00:01:05,380 --> 00:01:06,850 >> [音乐播放] 27 00:01:06,850 --> 00:01:12,260 28 00:01:12,260 --> 00:01:12,932 >> -hold它。 29 00:01:12,932 --> 00:01:13,657 跑了回来。 30 00:01:13,657 --> 00:01:14,733 >> - 等待一分钟。 31 00:01:14,733 --> 00:01:15,233 向右走。 32 00:01:15,233 --> 00:01:16,371 33 00:01:16,371 --> 00:01:16,870 -There。 34 00:01:16,870 --> 00:01:17,369 冻结。 35 00:01:17,369 --> 00:01:17,930 - 全屏幕。 36 00:01:17,930 --> 00:01:18,376 >> - 确定。 37 00:01:18,376 --> 00:01:18,875 冻结。 38 00:01:18,875 --> 00:01:20,160 向上拧得过紧上,你愿意吗? 39 00:01:20,160 --> 00:01:22,126 >> -Vector在上 小伙的后轮。 40 00:01:22,126 --> 00:01:24,435 >> -zoom在这里在这一点上。 41 00:01:24,435 --> 00:01:28,580 >> - 带有合适的设备中, 图像可以放大和激化。 42 00:01:28,580 --> 00:01:29,330 >> - 什么是什么? 43 00:01:29,330 --> 00:01:30,780 >> - 它是一个提升计划。 44 00:01:30,780 --> 00:01:32,170 >> - 你能清楚了没有? 45 00:01:32,170 --> 00:01:33,070 >> - 我不知道。 46 00:01:33,070 --> 00:01:34,150 让我们增强了。 47 00:01:34,150 --> 00:01:35,440 >> - 增强部分A6。 48 00:01:35,440 --> 00:01:36,570 49 00:01:36,570 --> 00:01:38,562 í增强的细节,还有 - 50 00:01:38,562 --> 00:01:40,020 - 我认为有足够的提升。 51 00:01:40,020 --> 00:01:40,976 它释放到我的屏幕。 52 00:01:40,976 --> 00:01:42,559 >> - 我增强了她的眼睛反射。 53 00:01:42,559 --> 00:01:44,322 - 让我们通过运行这个 视频增强。 54 00:01:44,322 --> 00:01:45,210 >> -Edgar,可以加强这方面的? 55 00:01:45,210 --> 00:01:45,710 >> -hang上。 56 00:01:45,710 --> 00:01:47,570 57 00:01:47,570 --> 00:01:49,458 >> -I've一直在研究这种反映。 58 00:01:49,458 --> 00:01:50,402 >> -There的人的反思。 59 00:01:50,402 --> 00:01:50,902 >> - 反射。 60 00:01:50,902 --> 00:01:52,870 -There是男人的脸的反映。 61 00:01:52,870 --> 00:01:53,694 >> -The反思! 62 00:01:53,694 --> 00:01:54,610 -There的一个反映。 63 00:01:54,610 --> 00:01:55,880 -zoom在上镜。 64 00:01:55,880 --> 00:01:57,860 你可以看到一个反映。 65 00:01:57,860 --> 00:01:59,630 >> - 你能在这里提升形象? 66 00:01:59,630 --> 00:02:00,377 67 00:02:00,377 --> 00:02:01,210 - 你能提高吗? 68 00:02:01,210 --> 00:02:02,190 - 你能提高吗? 69 00:02:02,190 --> 00:02:03,066 - 可我们加强这方面的? 70 00:02:03,066 --> 00:02:03,898 - 你能提高吗? 71 00:02:03,898 --> 00:02:04,740 -hold在第二。 72 00:02:04,740 --> 00:02:05,281 我会加强。 73 00:02:05,281 --> 00:02:06,470 -zoom在门上。 74 00:02:06,470 --> 00:02:06,970 -Times 10。 75 00:02:06,970 --> 00:02:08,009 -zoom。 76 00:02:08,009 --> 00:02:08,509 -Move英寸 77 00:02:08,509 --> 00:02:09,340 - 更多。 78 00:02:09,340 --> 00:02:10,094 -wait,停止。 79 00:02:10,094 --> 00:02:10,750 -stop。 80 00:02:10,750 --> 00:02:11,250 -pause它。 81 00:02:11,250 --> 00:02:13,542 -rotate我们75度 绕垂直,请。 82 00:02:13,542 --> 00:02:14,750 83 00:02:14,750 --> 00:02:16,127 >> -stop。 84 00:02:16,127 --> 00:02:19,330 回去的一部分 关于门了。 85 00:02:19,330 --> 00:02:21,420 >> -Got图像增强器,可以位图? 86 00:02:21,420 --> 00:02:24,420 >> - 也许我们可以使用普拉迪普·辛格 方法看进窗户。 87 00:02:24,420 --> 00:02:25,902 >> -The软件是最先进的。 88 00:02:25,902 --> 00:02:26,866 >> -The特征值是关闭的。 89 00:02:26,866 --> 00:02:29,758 >> - 随着权 algorithms--组合 90 00:02:29,758 --> 00:02:32,168 >> - 他的拍摄照明 算法,以一个新的水平, 91 00:02:32,168 --> 00:02:34,110 我可以用它们来 加强这方面的照片。 92 00:02:34,110 --> 00:02:36,840 >> -lock上并放大的z轴。 93 00:02:36,840 --> 00:02:37,351 >> - 增强。 94 00:02:37,351 --> 00:02:37,850 增强。 95 00:02:37,850 --> 00:02:38,720 - 增强。 96 00:02:38,720 --> 00:02:40,070 -freeze和提高。 97 00:02:40,070 --> 00:02:43,420 [完视频回放] 98 00:02:43,420 --> 00:02:45,830 戴维·J·马兰:所以这些都是 所有的话,但他们并不 99 00:02:45,830 --> 00:02:47,870 句子中的正确使用。 100 00:02:47,870 --> 00:02:52,370 而事实上,在未来,任何时候 拜托,你听到有人说一句话, 101 00:02:52,370 --> 00:02:54,250 “提升,”轻笑只是一点点。 102 00:02:54,250 --> 00:02:57,190 因为当你试图提升, 举例来说,这是发生了什么。 103 00:02:57,190 --> 00:02:58,580 >> 因此,这里是一个美丽的照片。 104 00:02:58,580 --> 00:02:59,720 这是CS50自己Daven。 105 00:02:59,720 --> 00:03:03,740 并假设我们想 聚焦于眨了一下眼睛, 106 00:03:03,740 --> 00:03:05,870 或的反射 坏家伙,显然是 107 00:03:05,870 --> 00:03:07,820 由安全摄像机拍摄的。 108 00:03:07,820 --> 00:03:10,330 这是发生了什么时 你放大图像上 109 00:03:10,330 --> 00:03:14,060 只有数量有限 与它相关联的位。 110 00:03:14,060 --> 00:03:15,420 >> 这是你会得到什么。 111 00:03:15,420 --> 00:03:19,190 事实上,在Daven的眼睛 不过是4,也许6个像素 112 00:03:19,190 --> 00:03:22,110 这构成什么 在若隐若现的存在。 113 00:03:22,110 --> 00:03:25,890 所以,习题集四将最终有 你探索这个世界上,特别是 114 00:03:25,890 --> 00:03:28,090 由一些性质 我们所说的文件I / O,其中 115 00:03:28,090 --> 00:03:31,000 I / O是只是一种奇特的方式 说的输入和输出。 116 00:03:31,000 --> 00:03:34,280 >> 所以到目前为止,所有的相互作用 我们已经与一台电脑 117 00:03:34,280 --> 00:03:36,770 已在很大程度上与 键盘和屏幕 118 00:03:36,770 --> 00:03:40,770 但没有这么多的硬盘, 或保存文件的超越了那些你 119 00:03:40,770 --> 00:03:41,620 自己写的。 120 00:03:41,620 --> 00:03:44,570 你的计划迄今有 未建立和保存, 121 00:03:44,570 --> 00:03:46,270 并更新自己的文件。 122 00:03:46,270 --> 00:03:47,150 >> 那么,什么是文件? 123 00:03:47,150 --> 00:03:48,105 嗯,有点像JPEG格式。 124 00:03:48,105 --> 00:03:50,520 这是一个形象,你可能 有或上传至Facebook, 125 00:03:50,520 --> 00:03:51,690 或者看到在网络上的任何地方。 126 00:03:51,690 --> 00:03:54,460 事实上,那张照片我们只是 Daven的看到的是JPEG格式。 127 00:03:54,460 --> 00:03:57,570 而有趣 关于类似的JPEG文件 128 00:03:57,570 --> 00:04:02,170 是,它们可以被识别, 典型地,通过比特某些型态。 129 00:04:02,170 --> 00:04:05,200 >> 换句话说,它是什么, 区分JPEG格式从一个GIF 130 00:04:05,200 --> 00:04:08,109 从一个Word一个PING 从Excel文件中的文件? 131 00:04:08,109 --> 00:04:09,900 好吧,这只是不同 比特模式。 132 00:04:09,900 --> 00:04:12,820 而这些不同的图案 通常,在这些文件的开始处。 133 00:04:12,820 --> 00:04:18,200 >> 所以,当您的计算机打开一个Word DOC,或当计算机打开一个JPEG, 134 00:04:18,200 --> 00:04:20,940 它的外观通常是在 第一数位的文件中。 135 00:04:20,940 --> 00:04:24,059 如果它识别出模式, 它说,哦,这是一个形象。 136 00:04:24,059 --> 00:04:25,850 让我展示给 用户为图形。 137 00:04:25,850 --> 00:04:27,870 或者说,哦,这看起来像一个Word文档。 138 00:04:27,870 --> 00:04:30,480 让我展示给用户的一篇文章。 139 00:04:30,480 --> 00:04:33,020 >> 因此,例如,JPEG文件, 事实证明,有 140 00:04:33,020 --> 00:04:35,460 相当复杂 引擎盖下方。 141 00:04:35,460 --> 00:04:40,140 但在大多数每前三字节 JPEG开始与这三个数字。 142 00:04:40,140 --> 00:04:44,680 这样字节零个,一个,另外两个是,在 最每JPEG,255,则该数 143 00:04:44,680 --> 00:04:46,675 216,然后是电话号码255。 144 00:04:46,675 --> 00:04:48,990 >> ,你就可以什么 开始做下周 145 00:04:48,990 --> 00:04:52,920 其实底下戳 文件的引擎盖像JPEG图片 146 00:04:52,920 --> 00:04:57,210 而像位图文件,并查看 什么是一直存在的,只要 147 00:04:57,210 --> 00:04:58,650 当你使用计算机已经。 148 00:04:58,650 --> 00:05:01,860 >> 但是,什么是不存在一般 写的十进制数是这样的。 149 00:05:01,860 --> 00:05:04,620 计算机科学家不 往往在小数点说话。 150 00:05:04,620 --> 00:05:06,139 他们没有真正的二进制说话。 151 00:05:06,139 --> 00:05:07,930 通常,当我们想 来表达数字, 152 00:05:07,930 --> 00:05:10,710 我们实际使用十六进制, 您可能还记得 153 00:05:10,710 --> 00:05:13,027 ,比如说,从习题集 一,它挑战 154 00:05:13,027 --> 00:05:14,610 你想想不同的系统。 155 00:05:14,610 --> 00:05:17,170 >> 当然,我们都是熟悉的 与小数,0至9。 156 00:05:17,170 --> 00:05:18,215 我们谈到了二进制。 157 00:05:18,215 --> 00:05:20,710 我们真的没有 用这么多在这里 158 00:05:20,710 --> 00:05:22,470 对了,因为电脑会使用它。 159 00:05:22,470 --> 00:05:24,900 但是,程序员会很 常常,但不总是, 160 00:05:24,900 --> 00:05:29,360 用十六进制,这只是意味着 你有你的字母表16个字母, 161 00:05:29,360 --> 00:05:31,330 相对于两个或两个10。 162 00:05:31,330 --> 00:05:34,530 >> 那么,你如何指望更高 比十六进制9? 163 00:05:34,530 --> 00:05:41,120 你去0,1,2,3,4,5,6,7,8,9, A,B,C,D,E,F,只是约定。 164 00:05:41,120 --> 00:05:43,540 但是,什么是关键的是,每个 这是一个象征。 165 00:05:43,540 --> 00:05:44,340 有没有10。 166 00:05:44,340 --> 00:05:48,400 有没有11本身,因为每 你的数字,就像在小数 167 00:05:48,400 --> 00:05:51,940 而就像在二进制,应该只是 是单个字符,按照约定。 168 00:05:51,940 --> 00:05:55,280 >> 所以这则是我们的字母表 我们所掌握的十六进制数。 169 00:05:55,280 --> 00:05:58,600 那么什么是JPEG格式的样子,如果你 要写出那些前三 170 00:05:58,600 --> 00:06:01,980 不是字节为十进制但是, 例如,为十六进制? 171 00:06:01,980 --> 00:06:03,640 而为什么是十六进制,甚至所有有用吗? 172 00:06:03,640 --> 00:06:05,290 >> 好了,快看一个例子。 173 00:06:05,290 --> 00:06:09,030 所以,如果我写出来的比特 代表这些小数numbers-- 174 00:06:09,030 --> 00:06:12,450 这可能是一个有点生疏 现在从几个星期前, 175 00:06:12,450 --> 00:06:14,820 但左1和 合适的人是很容易。 176 00:06:14,820 --> 00:06:17,990 255是最大的数字,我们 可以代表与八位。 177 00:06:17,990 --> 00:06:18,820 这是所有的人。 178 00:06:18,820 --> 00:06:21,320 因此,只有一个是轻度 有趣的是中间的一个。 179 00:06:21,320 --> 00:06:24,700 善良的,如果你做出来的 数学,你会推断出,事实上, 180 00:06:24,700 --> 00:06:27,949 一个是模式, 零代表216。 181 00:06:27,949 --> 00:06:30,240 所以我们只订定 现在,这些都是正确的。 182 00:06:30,240 --> 00:06:31,730 但为什么这很有趣? 183 00:06:31,730 --> 00:06:33,970 >> 好了,一个字节,当然,为8位。 184 00:06:33,970 --> 00:06:38,980 而事实证明,如果你认为 一个字节的四位两个大块, 185 00:06:38,980 --> 00:06:39,500 像这样。 186 00:06:39,500 --> 00:06:41,000 让我补充一些空间。 187 00:06:41,000 --> 00:06:42,550 所以在后。 188 00:06:42,550 --> 00:06:46,520 我只是添加了一些空白 可视化的缘故这里。 189 00:06:46,520 --> 00:06:51,840 我们怎么可能现在代表, 比方说,十六进制位各四, 190 00:06:51,840 --> 00:06:52,880 每个四位组? 191 00:06:52,880 --> 00:06:56,420 >> 因此,例如,在左侧 现在,我们有1111的二进制文件。 192 00:06:56,420 --> 00:07:00,420 什么是十进制的数字, 如果你做出来的数学? 193 00:07:00,420 --> 00:07:03,780 你有那些地方,三三两两的地方, 四肢着地的地方,和八分的地方。 194 00:07:03,780 --> 00:07:04,341 >> 听众:15。 195 00:07:04,341 --> 00:07:05,340 戴维·J·马兰:这是15。 196 00:07:05,340 --> 00:07:08,340 因此,如果我们做的八加4 加二加一,得到15。 197 00:07:08,340 --> 00:07:11,790 所以,我可以写下15以下 1111,但这里的整点 198 00:07:11,790 --> 00:07:13,190 是十六进制,十进制没有。 199 00:07:13,190 --> 00:07:17,310 所以不是写下15,1-5, 我要编写十六进制, 200 00:07:17,310 --> 00:07:22,311 而如果你想回来,如果你有 零到f,什么15将是? 201 00:07:22,311 --> 00:07:22,810 听众:F。 202 00:07:22,810 --> 00:07:24,434 戴维·J·马兰:那么原来它的F。 203 00:07:24,434 --> 00:07:29,140 而且你可以工作了这一点说, 还有,如果是10,然后单击OK,f为15。 204 00:07:29,140 --> 00:07:33,250 所以事实上,我们可以重写 同一组数字为F F的。 205 00:07:33,250 --> 00:07:35,750 然后,如果我们做数学的一点, 我们推断,该公司的D。 206 00:07:35,750 --> 00:07:38,650 八是很容易的,因为我们 有一个在八分地方。 207 00:07:38,650 --> 00:07:40,620 然后,我们有一对夫妇更多的F F的。 208 00:07:40,620 --> 00:07:44,669 >> 那么,人类倾向于做了约定 当他们用十六进制是他们只是 209 00:07:44,669 --> 00:07:47,710 更简洁地写这一点, 摆脱大部分的空白。 210 00:07:47,710 --> 00:07:50,890 和刚需超清晰 读者,这是十六进制, 211 00:07:50,890 --> 00:07:54,670 中简单的约定 人类是你写零 212 00:07:54,670 --> 00:07:58,000 x,它是没有意义的其他 比的视觉识别, 213 00:07:58,000 --> 00:07:59,590 又来了一个十六进制数。 214 00:07:59,590 --> 00:08:04,210 >> 然后,你把两个数字,F f单位这种情况下,则d a,则F F。 215 00:08:04,210 --> 00:08:06,700 所以长话短说, 十六进制刚刚趋于 216 00:08:06,700 --> 00:08:11,990 是有用的,因为它的每一个 数字,零到F,完美线条 217 00:08:11,990 --> 00:08:13,880 了四个比特的图案。 218 00:08:13,880 --> 00:08:18,080 >> 所以,如果你有两个十六进制数字, 零到F,一遍又一遍, 219 00:08:18,080 --> 00:08:20,256 ,让你完美 8位或1字节。 220 00:08:20,256 --> 00:08:22,380 所以这就是为什么它往往 通常是有用的。 221 00:08:22,380 --> 00:08:24,990 有没有智慧 内容真的除此之外, 222 00:08:24,990 --> 00:08:27,010 比其实际效用等。 223 00:08:27,010 --> 00:08:29,310 >> 现在JPEG文件不是唯一 文件格式的图形。 224 00:08:29,310 --> 00:08:33,230 您可能还记得,有 像这样的文件在世界上, 225 00:08:33,230 --> 00:08:34,830 至少从几年前。 226 00:08:34,830 --> 00:08:37,580 >> 因此,这实际上是 安装在Windows XP中 227 00:08:37,580 --> 00:08:39,960 对数以百万计的世界各地的个人电脑。 228 00:08:39,960 --> 00:08:43,000 这是一个位图文件,BMP。 229 00:08:43,000 --> 00:08:47,690 和位图文件,你会看到下一个 本周,只是意味着圆点的图案, 230 00:08:47,690 --> 00:08:51,710 因为他们是所谓的像素, 一张地图上的位,真的。 231 00:08:51,710 --> 00:08:55,160 >> 那么,什么是有趣的,但是, 这个文件格式,BMP,是 232 00:08:55,160 --> 00:08:58,590 该发动机罩的下面,它 已经不仅仅是三个字节 233 00:08:58,590 --> 00:09:01,020 ,组成它的头,所以 可以说,最初的几个叮咬。 234 00:09:01,020 --> 00:09:03,330 实际上,它看起来有点 乍看复杂。 235 00:09:03,330 --> 00:09:04,704 你会看到这个在P组。 236 00:09:04,704 --> 00:09:06,810 和得到的东西 特别是出了现在这个 237 00:09:06,810 --> 00:09:10,720 不那么重要,因为只是事实 即在每一个位图的开始 238 00:09:10,720 --> 00:09:13,823 文件以图形格式, 还有一大堆数字。 239 00:09:13,823 --> 00:09:14,980 240 00:09:14,980 --> 00:09:16,720 >> 现在,微软, 这种格式的作家, 241 00:09:16,720 --> 00:09:18,820 往往那些打电话 事情不是整数和字符 242 00:09:18,820 --> 00:09:22,259 和花车,但文字和D 单词和长和字节。 243 00:09:22,259 --> 00:09:23,800 所以,他们只是不同的数据类型。 244 00:09:23,800 --> 00:09:25,170 他们是不同的名字 同样的事情。 245 00:09:25,170 --> 00:09:26,740 但你会看到,在P设定四。 246 00:09:26,740 --> 00:09:31,450 >> 但是这仅仅是说,如果一个人的 双击某些文件.BMP他 247 00:09:31,450 --> 00:09:35,015 或她的硬盘驱动器,并打开一个窗口 一个显示他或她的形象, 248 00:09:35,015 --> 00:09:38,500 发生因为操作 系统想必注意到,不仅 249 00:09:38,500 --> 00:09:41,460 .BMP文件扩展名 在文件名中, 250 00:09:41,460 --> 00:09:45,010 而且事实上,有一些 公约比特模式 251 00:09:45,010 --> 00:09:47,490 在开始的时候 位图文件。 252 00:09:47,490 --> 00:09:50,270 >> 但是,让我们现在专注于 这样一个复杂的文件, 253 00:09:50,270 --> 00:09:52,120 而是对这样的事情。 254 00:09:52,120 --> 00:09:55,190 这里假设gedit中,我 只是开端 255 00:09:55,190 --> 00:09:57,070 的程序,非常简单。 256 00:09:57,070 --> 00:09:58,860 我有一些包括向上顶。 257 00:09:58,860 --> 00:10:02,120 现在我已经得到了#包括“structs.h”,但 我会回来的,在一个时刻。 258 00:10:02,120 --> 00:10:03,974 但是,该方法适用于现在。 259 00:10:03,974 --> 00:10:05,890 因此,这是一个程序 那将实施 260 00:10:05,890 --> 00:10:07,335 如处长的数据库。 261 00:10:07,335 --> 00:10:09,710 因此,学生的数据库, 和每一个学生在世界 262 00:10:09,710 --> 00:10:13,190 有一个名字和一个房子,可能是一些 其他的东西,但我们会保持它的简单。 263 00:10:13,190 --> 00:10:15,140 每一个学生都有一个名字和一个房子。 264 00:10:15,140 --> 00:10:17,700 >> 所以,如果我想写一个 计划,其目的在生活中 265 00:10:17,700 --> 00:10:19,860 刚刚从循环 零上最多三个, 266 00:10:19,860 --> 00:10:22,070 如果有三名学生 在哈佛大学。 267 00:10:22,070 --> 00:10:25,350 我只是想,用GetString的, 每个学生的名字和房子, 268 00:10:25,350 --> 00:10:26,600 然后只是打印出来的那些。 269 00:10:26,600 --> 00:10:28,630 >> 这有点像周 其中,第二周的东西,现在, 270 00:10:28,630 --> 00:10:30,810 在这里我只想对 环或类似的东西。 271 00:10:30,810 --> 00:10:34,500 我想打电话给GetString的几 次,然后打印为f的几十倍。 272 00:10:34,500 --> 00:10:37,340 所以,我怎么可以这样做,但是, 当这两个名字和房子 273 00:10:37,340 --> 00:10:39,070 所涉及的每一个学生? 274 00:10:39,070 --> 00:10:42,830 >> 所以,我的第一反应可能 可以做这样的事情。 275 00:10:42,830 --> 00:10:49,620 我会先说,好了,给我, 说,叫名字的字符串数组。 276 00:10:49,620 --> 00:10:51,530 我不想硬编码3在这里。 277 00:10:51,530 --> 00:10:53,064 我想要什么就放那里? 278 00:10:53,064 --> 00:10:55,730 所以学生们,因为这只是 在顶部声明一个常数, 279 00:10:55,730 --> 00:10:57,860 就这样我就不必硬编码 3在多个地方。 280 00:10:57,860 --> 00:11:00,859 这样一来,我可以改变它一个地方, 它影响的变化随处可见。 281 00:11:00,859 --> 00:11:04,470 然后,我可能会做 串安置学生。 282 00:11:04,470 --> 00:11:10,250 >> 而现在,我可能会做这样的事情 为(int i = 0;我<学生,我有用。 283 00:11:10,250 --> 00:11:14,390 所以,我打字快​​,但这是 可能熟悉的语法了。 284 00:11:14,390 --> 00:11:17,030 >> 而现在,这是更近一些。 285 00:11:17,030 --> 00:11:22,890 如果我想要把在第i个 学生的名字,我想我做到这一点。 286 00:11:22,890 --> 00:11:26,480 然后,没有名字 但房子级别I。 287 00:11:26,480 --> 00:11:29,930 我这样做,GetString的,并让 我回去和修复这条线。 288 00:11:29,930 --> 00:11:30,430 同意吗? 289 00:11:30,430 --> 00:11:31,200 不同意? 290 00:11:31,200 --> 00:11:32,366 这不是很人性化。 291 00:11:32,366 --> 00:11:33,890 我还没有告诉用户该怎么做。 292 00:11:33,890 --> 00:11:36,520 >> 但现在,如果我还 希望以后,我们 293 00:11:36,520 --> 00:11:40,060 比如,打印这些东西 out--所以TODO后。 294 00:11:40,060 --> 00:11:42,330 我会做更多的 this--这无疑就是 295 00:11:42,330 --> 00:11:45,970 正确实施 越来越名字和房子,三 296 00:11:45,970 --> 00:11:48,870 它们的总的每一个,从用户。 297 00:11:48,870 --> 00:11:51,280 >> 但是,这不是很好的设计,对不对? 298 00:11:51,280 --> 00:11:55,220 如果学生已经不仅仅是一个名字 和一所房子,但也是一个ID号, 299 00:11:55,220 --> 00:11:57,770 和一个电话号码, 和一个电子邮件地址, 300 00:11:57,770 --> 00:12:00,280 也许一个主页,并 也许是Twitter的手柄, 301 00:12:00,280 --> 00:12:03,730 和任意数量的其他细节 一个学生或一个人有关, 302 00:12:03,730 --> 00:12:04,610 更普遍。 303 00:12:04,610 --> 00:12:07,720 我们该如​​何开始添加 功能,这个程序? 304 00:12:07,720 --> 00:12:14,080 >> 嗯,我觉得最简单的方法可能 可以做这样的事情,比方说, 305 00:12:14,080 --> 00:12:16,490 诠释IDS学生。 306 00:12:16,490 --> 00:12:18,380 这样我就可以把所有的标识在了那里。 307 00:12:18,380 --> 00:12:22,240 然后,对于一些 如电话号码, 308 00:12:22,240 --> 00:12:24,400 我不知道如何 代表了,只是还没有。 309 00:12:24,400 --> 00:12:30,280 因此,让我们继续前进,只需要调用 这个Twitter的学生,其中 310 00:12:30,280 --> 00:12:33,550 是有点怪,但 - 和一帮更多的领域。 311 00:12:33,550 --> 00:12:36,360 >> 我已经开始有效 复制并粘贴在这里。 312 00:12:36,360 --> 00:12:39,416 这是要相当长 笨拙的很快,对不对? 313 00:12:39,416 --> 00:12:42,290 那岂不是很好,如果有 在世界的数据结构称为 314 00:12:42,290 --> 00:12:45,600 而不是整数或字符串,但一些 较高的水平,一个抽象,所以 315 00:12:45,600 --> 00:12:47,570 可以说,被称为是学生吗? 316 00:12:47,570 --> 00:12:50,220 Ç没有配备内置 对学生的功能, 317 00:12:50,220 --> 00:12:52,260 但如果我想给它这样的? 318 00:12:52,260 --> 00:12:55,640 >> 嗯,事实证明,我要去 打开一个名为structs.h这里的文件, 319 00:12:55,640 --> 00:12:57,090 你可以准确的做。 320 00:12:57,090 --> 00:12:58,290 我们打​​算从现在开始这样做。 321 00:12:58,290 --> 00:13:01,490 和P组三个的引擎盖下面, 你已经这样做了。 322 00:13:01,490 --> 00:13:05,920 有没有这样的事,作为一个克矩形或 在编程语言C的克椭圆形 323 00:13:05,920 --> 00:13:10,570 >> 人们在斯坦福实现这些 由此处使用这种方法的数据类型, 324 00:13:10,570 --> 00:13:13,900 宣布自己的新数据 使用new关键字类型 325 00:13:13,900 --> 00:13:16,744 所谓的结构,另一个 一个叫的typedef。 326 00:13:16,744 --> 00:13:19,660 而事实上,即使语法 看上去从东西有点不同 327 00:13:19,660 --> 00:13:23,550 我们已经看到过,在 原则上,这是超级简单。 328 00:13:23,550 --> 00:13:25,297 >> 这只是意味着“定义一个类型。” 329 00:13:25,297 --> 00:13:27,255 这将是一个 结构和结构 330 00:13:27,255 --> 00:13:29,400 就像是一个容器 多重的东西。 331 00:13:29,400 --> 00:13:31,780 而这个结构是怎么回事 有一个名为name的字符串, 332 00:13:31,780 --> 00:13:33,210 和一个字符串名为房子。 333 00:13:33,210 --> 00:13:37,520 而且,我们打电话,只是为了方便, 这整个数据结构的学生。 334 00:13:37,520 --> 00:13:40,320 >> 所以,此刻你到 分号,你现在有 335 00:13:40,320 --> 00:13:43,280 创建您自己的数据 类型称为学生 336 00:13:43,280 --> 00:13:46,420 现在站在旁边诠释, 和float和char和字符串, 337 00:13:46,420 --> 00:13:50,270 和g矩形,和g椭圆形,以及任何数目的 其他的事情人发明的。 338 00:13:50,270 --> 00:13:53,340 >> 那么什么是这个有用 现在,如果我回去 339 00:13:53,340 --> 00:13:57,430 为结构0,完成本 实施,这是我写的 340 00:13:57,430 --> 00:14:02,080 提前在这里,请注意,所有的 不可避免的杂乱的 341 00:14:02,080 --> 00:14:05,490 即将开始发生,因为我加入 电话号码和鸟鸣和所有 342 00:14:05,490 --> 00:14:07,370 这些其他的事情 学生的定义, 343 00:14:07,370 --> 00:14:11,810 现在它简洁地包裹起来 因为只有一个阵列的学生。 344 00:14:11,810 --> 00:14:15,500 >> 而每个学生的现在 拥有它里面多的东西。 345 00:14:15,500 --> 00:14:16,930 因此,仅仅留下一个问题。 346 00:14:16,930 --> 00:14:19,700 你怎么看名字搞定, 和房子,和ID, 347 00:14:19,700 --> 00:14:21,640 和任何其他的 里面的学生? 348 00:14:21,640 --> 00:14:22,930 超级简单的,也是如此。 349 00:14:22,930 --> 00:14:25,730 新的语法,但一个简单的想法。 350 00:14:25,730 --> 00:14:29,239 >> 您只需索引数组, 正如我们上周和这一样。 351 00:14:29,239 --> 00:14:31,030 什么是明确的 新片语法? 352 00:14:31,030 --> 00:14:32,590 353 00:14:32,590 --> 00:14:35,880 只是,,意为“进去了 结构,并得到现场叫 354 00:14:35,880 --> 00:14:39,030 名,拿到所谓的房子现场, 让学生称为该领域。“ 355 00:14:39,030 --> 00:14:41,940 >> 因此,在P设定三,如果你 还在努力的, 356 00:14:41,940 --> 00:14:44,020 和大多数人仍 是,要认识到你 357 00:14:44,020 --> 00:14:46,130 开始使用类似的东西 克rects和g椭圆形 358 00:14:46,130 --> 00:14:50,201 和其他的东西似乎没有了 来自周零个,一个或两个, 359 00:14:50,201 --> 00:14:52,950 意识到这是因为斯坦福大学 宣布了一些新的数据类型。 360 00:14:52,950 --> 00:14:56,160 >> 事实上,这也正是我们将 什么时候,以及在P设定四, 361 00:14:56,160 --> 00:14:59,880 我们先来处理事情 像的图像,位图,等等。 362 00:14:59,880 --> 00:15:02,882 所以,这只是一个玩笑话和 心智模式是什么来。 363 00:15:02,882 --> 00:15:04,590 现在,我一拖再拖 有些今天上午。 364 00:15:04,590 --> 00:15:09,560 我是那种好奇,想看看是什么 其实微软壁纸 365 00:15:09,560 --> 00:15:10,310 貌似今天。 366 00:15:10,310 --> 00:15:15,200 而事实证明,一个人在2006年 居然跑到几乎一样, 367 00:15:15,200 --> 00:15:19,210 在同一地点,以在现实中拍摄 什么样子的,这些天。 368 00:15:19,210 --> 00:15:21,380 本场现在是有点杂草丛生。 369 00:15:21,380 --> 00:15:24,850 >> 因此,图像的现在来讲, 让我们带回Daven这里 370 00:15:24,850 --> 00:15:26,890 屏幕和Nicholas上, 而只是提醒你 371 00:15:26,890 --> 00:15:30,540 如果你想和我们一起吃午饭 本周五,头我们平常网址 372 00:15:30,540 --> 00:15:31,440 这里。 373 00:15:31,440 --> 00:15:33,530 >> 那么,我们曾在周一离开了吗? 374 00:15:33,530 --> 00:15:35,140 我们推出了这个问题,对不对? 375 00:15:35,140 --> 00:15:37,610 这看似是一个正确的 实现交换的, 376 00:15:37,610 --> 00:15:40,460 因此你要带两个整数, 一个叫A,一个叫B, 377 00:15:40,460 --> 00:15:44,130 交换它们,就像劳拉在这里做 在与牛奶和水的阶段, 378 00:15:44,130 --> 00:15:46,820 通过使用临时 变量或空杯, 379 00:15:46,820 --> 00:15:50,540 这样我们就可以把B,在和中 b移动,而不做乱七八糟的东西。 380 00:15:50,540 --> 00:15:51,560 我们用一个变量。 381 00:15:51,560 --> 00:15:52,870 这就是所谓的温度。 382 00:15:52,870 --> 00:15:55,520 >> 但是,什么是根本 问题在周一这个代码? 383 00:15:55,520 --> 00:15:57,700 384 00:15:57,700 --> 00:15:58,870 是什么问题就在这里? 385 00:15:58,870 --> 00:16:00,106 386 00:16:00,106 --> 00:16:00,605 是啊。 387 00:16:00,605 --> 00:16:01,970 >> 听众:它占用更多的空间。 388 00:16:01,970 --> 00:16:04,719 >> 戴维·J·马兰:占用更多 空间,因为我使用的是可变的, 389 00:16:04,719 --> 00:16:05,400 那没关系。 390 00:16:05,400 --> 00:16:07,300 这是事实,但我 会说没关系。 391 00:16:07,300 --> 00:16:10,030 这只是32大位 物联网方案,所以没什么大不了的。 392 00:16:10,030 --> 00:16:10,655 其他的想法? 393 00:16:10,655 --> 00:16:12,572 听众:这只是交换 这些变量在本地。 394 00:16:12,572 --> 00:16:13,571 戴维·J·马兰:没错。 395 00:16:13,571 --> 00:16:15,090 它只能在本地交换的变量。 396 00:16:15,090 --> 00:16:18,173 因为任何时候你调用一个函数 - 当我从安嫩伯格托盘 397 00:16:18,173 --> 00:16:19,840 最后一次,你主要在底部。 398 00:16:19,840 --> 00:16:23,560 只要您拨打一个叫做函数 掉期,掉期没有得到x和y, 399 00:16:23,560 --> 00:16:24,400 原来的值。 400 00:16:24,400 --> 00:16:26,392 什么交换的GET,我们什么要求? 401 00:16:26,392 --> 00:16:27,100 听众:复制。 402 00:16:27,100 --> 00:16:28,090 戴维·J·马兰:所以他们的副本。 403 00:16:28,090 --> 00:16:31,120 所以它得到一个和两个,如果 记得上次的例子, 404 00:16:31,120 --> 00:16:34,730 但是一个和两个副本 被成功交换。 405 00:16:34,730 --> 00:16:38,550 但不幸的是,最终, 这些值仍然是相同的。 406 00:16:38,550 --> 00:16:41,880 因此,我们可以看到这与我们的 新朋友,希望广发行, 407 00:16:41,880 --> 00:16:45,180 您或转录因子和Ca的有 在指导你走向如下。 408 00:16:45,180 --> 00:16:51,210 >> 因此,没有掉召回看起来like--我们 开拓this--看起来像这样。 409 00:16:51,210 --> 00:16:54,160 我们初始化X要1,Y两。 410 00:16:54,160 --> 00:16:55,620 有一堆打印F公司。 411 00:16:55,620 --> 00:16:58,080 但随后,该按键通话 这里是交换,这 412 00:16:58,080 --> 00:17:00,260 正是我们的代码 就是刚才看到的。 413 00:17:00,260 --> 00:17:03,180 这是正确的,在第一 一目了然,但在功能上, 414 00:17:03,180 --> 00:17:06,800 这个方案行不通,因为 它不会永久交换x和y。 415 00:17:06,800 --> 00:17:10,190 >> 因此,让我们看到这个,咋暖 在这里用GDB中,./noswap。 416 00:17:10,190 --> 00:17:11,867 417 00:17:11,867 --> 00:17:15,200 一堆铺天盖地的信息 我会摆脱与控制L现在。 418 00:17:15,200 --> 00:17:17,516 而现在,我要 继续并运行它。 419 00:17:17,516 --> 00:17:19,349 不幸的是,这 是没有多大用处的。 420 00:17:19,349 --> 00:17:22,355 它运行的程序这里面 程序调用GDB,调试器, 421 00:17:22,355 --> 00:17:23,730 但它并没有让我闲逛。 422 00:17:23,730 --> 00:17:26,229 >> 所以,我怎么能真正暂停 执行这个程序里面? 423 00:17:26,229 --> 00:17:27,410 424 00:17:27,410 --> 00:17:28,329 因此打破。 425 00:17:28,329 --> 00:17:32,340 我可以打破任何 行数,1,10,15。 426 00:17:32,340 --> 00:17:35,530 但我也可以打破象征 说休息为主。 427 00:17:35,530 --> 00:17:38,980 这就是要设置一个断点 点,显然在主线16。 428 00:17:38,980 --> 00:17:40,050 而其中的16行? 429 00:17:40,050 --> 00:17:42,960 让我们去到的代码 并上升到noswap。 430 00:17:42,960 --> 00:17:46,930 事实上,第16行是 第一个在程序中。 431 00:17:46,930 --> 00:17:52,130 >> 所以,现在,如果我继续和类型 运行这个时候,回车,就暂停。 432 00:17:52,130 --> 00:17:53,080 因此,让我们闲逛。 433 00:17:53,080 --> 00:17:55,716 打印x--为什么是X为零? 434 00:17:55,716 --> 00:17:56,705 435 00:17:56,705 --> 00:17:57,830 而忽略了美元符号。 436 00:17:57,830 --> 00:17:59,725 这还只是票友 使用的程序的。 437 00:17:59,725 --> 00:18:00,780 438 00:18:00,780 --> 00:18:03,140 为什么为x为零的时刻? 439 00:18:03,140 --> 00:18:03,640 是啊。 440 00:18:03,640 --> 00:18:07,061 >> 听众:它暂停前的权利 线16,而不是实际的线16。 441 00:18:07,061 --> 00:18:08,060 戴维·J·马兰:没错。 442 00:18:08,060 --> 00:18:11,630 广发行,在默认情况下,已暂停 只是线16日前执行。 443 00:18:11,630 --> 00:18:14,820 因此它没有执行,其中 意味着x是一些不知名的价值。 444 00:18:14,820 --> 00:18:17,150 我们很幸运,它的 干净的东西像为零。 445 00:18:17,150 --> 00:18:20,310 所以,如果我输入下一个,现在, 现在执行16。 446 00:18:20,310 --> 00:18:22,000 它等待我去执行17。 447 00:18:22,000 --> 00:18:23,400 让我继续前进,打印的X. 448 00:18:23,400 --> 00:18:24,094 这是之一。 449 00:18:24,094 --> 00:18:25,260 让我继续前进,印刷年。 450 00:18:25,260 --> 00:18:26,176 我现在应该看到了什么? 451 00:18:26,176 --> 00:18:27,660 452 00:18:27,660 --> 00:18:28,560 >> 听众:[听不清] 453 00:18:28,560 --> 00:18:29,165 >> 戴维·J·马兰:大声一点。 454 00:18:29,165 --> 00:18:30,040 >> 听众:[听不清] 455 00:18:30,040 --> 00:18:30,537 456 00:18:30,537 --> 00:18:32,120 戴维·J·马兰:不太一致。 457 00:18:32,120 --> 00:18:34,760 所以,是的,我们看到一些垃圾值。 458 00:18:34,760 --> 00:18:37,862 现在,y是134514064那里。 459 00:18:37,862 --> 00:18:39,320 好吧,这只是一些垃圾值。 460 00:18:39,320 --> 00:18:41,350 我的程序使用内存 为不同的目的。 461 00:18:41,350 --> 00:18:42,350 还有其他功能。 462 00:18:42,350 --> 00:18:44,040 别人写我的电脑里面。 463 00:18:44,040 --> 00:18:46,789 所以这些位已经被用于 其他的价值观,我所看到的 464 00:18:46,789 --> 00:18:49,470 是一些残余 在先使用该内存。 465 00:18:49,470 --> 00:18:53,350 >> 所以,没什么大不了的,因为一旦 我键入下一个,然后打印Y, 466 00:18:53,350 --> 00:18:55,640 它的初始化 我想要的价值。 467 00:18:55,640 --> 00:18:57,400 所以,现在,让我们继续快一点。 468 00:18:57,400 --> 00:18:58,540 n转到下一个。 469 00:18:58,540 --> 00:18:59,570 让我们再做一次。 470 00:18:59,570 --> 00:19:00,530 让我们再做一次。 471 00:19:00,530 --> 00:19:02,404 但我不想打 在这里,因为如果我 472 00:19:02,404 --> 00:19:05,110 想看看里面有什么事情 掉,有什么命令? 473 00:19:05,110 --> 00:19:05,520 >> 听众:步骤。 474 00:19:05,520 --> 00:19:06,436 >> 戴维·J·马兰:步骤。 475 00:19:06,436 --> 00:19:09,800 所以这个步骤我变成了 功能,而不是通过它。 476 00:19:09,800 --> 00:19:12,270 而现在,这是一个有点神秘 说实话,但是这仅仅是 477 00:19:12,270 --> 00:19:14,581 告诉我,我在第33行了。 478 00:19:14,581 --> 00:19:15,580 让我们再次做到这一点。 479 00:19:15,580 --> 00:19:16,080 打印温度。 480 00:19:16,080 --> 00:19:17,129 481 00:19:17,129 --> 00:19:20,170 垃圾值,负此时, 但是这仍然只是一个垃圾值。 482 00:19:20,170 --> 00:19:22,810 因此,让我们做下一个,打印温度。 483 00:19:22,810 --> 00:19:27,130 它初始化为1,这 是x的值,也叫做。 484 00:19:27,130 --> 00:19:29,110 >> 现在,这里是我们的a和从X来了吗? 485 00:19:29,110 --> 00:19:32,510 好吧,注意主,我们 所谓的这些值x和y。 486 00:19:32,510 --> 00:19:34,740 然后,我们通过他们交换如下。 487 00:19:34,740 --> 00:19:37,010 点¯x排在第一位,逗号年。 488 00:19:37,010 --> 00:19:40,020 然后,交换可以称他们为x和y。 489 00:19:40,020 --> 00:19:42,630 但为清楚起见,这是 称他们为A和B。 490 00:19:42,630 --> 00:19:45,970 但a和b是现在将要 x和y分别的拷贝。 491 00:19:45,970 --> 00:19:50,660 >> 所以,如果我回去GDB,温度 现在是一年,现在1。 492 00:19:50,660 --> 00:19:56,130 但是,如果我做一个和现在做的打印 A,A已经搬了过来。 493 00:19:56,130 --> 00:20:00,030 牛奶已经倒入前 橙汁的玻璃,或者反之亦然。 494 00:20:00,030 --> 00:20:04,750 >> 如果我下一次再这样做了,现在 如果我打印出来作为一个全面的检查, 495 00:20:04,750 --> 00:20:07,687 一是仍然是两个,但是B现在之一。 496 00:20:07,687 --> 00:20:08,770 坦率地说,它仍然存在。 497 00:20:08,770 --> 00:20:10,670 我不在乎什么温度的。 498 00:20:10,670 --> 00:20:16,850 但只要我现在打字,让我们说, 继续回去,现在我在最后 499 00:20:16,850 --> 00:20:17,480 该程序。 500 00:20:17,480 --> 00:20:20,730 不幸的是,x是 还是1和y仍然是2。 501 00:20:20,730 --> 00:20:22,272 >> 那么,什么是有GDB的效用? 502 00:20:22,272 --> 00:20:23,980 它没有帮我解决 该问题本身, 503 00:20:23,980 --> 00:20:26,265 但它希望能帮助我 理解它通过实现 504 00:20:26,265 --> 00:20:30,000 ,是的,我的逻辑是对的,但 我的代码是不是最终有 505 00:20:30,000 --> 00:20:31,450 产生长远的影响。 506 00:20:31,450 --> 00:20:34,570 所以这是一个问题,我们 要解决现在今天。 507 00:20:34,570 --> 00:20:37,870 >> 但是,让我们以这种方式到达那里。 508 00:20:37,870 --> 00:20:39,230 String是一个谎言。 509 00:20:39,230 --> 00:20:41,860 它也没有一种数据类型 存在于C.它是 510 00:20:41,860 --> 00:20:44,750 是一个代名词一些 时间的东西, 511 00:20:44,750 --> 00:20:47,300 我们可以揭示如下。 512 00:20:47,300 --> 00:20:53,282 >> 让我去进取,不断开拓 一个名为比0。 513 00:20:53,282 --> 00:20:56,240 而非键入此一出来, 我们将开始遍历代码 514 00:20:56,240 --> 00:20:58,040 我已经写了,但 这是只有几行。 515 00:20:58,040 --> 00:20:59,570 所以这是比较-0。 516 00:20:59,570 --> 00:21:02,380 的第一件事情我做 越来越一行文本。 517 00:21:02,380 --> 00:21:05,610 >> 但是要注意什么,我 做第一次。 518 00:21:05,610 --> 00:21:07,910 什么是明确约21行有什么不同? 519 00:21:07,910 --> 00:21:10,020 520 00:21:10,020 --> 00:21:11,402 其实,等一下。 521 00:21:11,402 --> 00:21:12,110 这是一份2。 522 00:21:12,110 --> 00:21:13,568 这甚至不是正确的程序。 523 00:21:13,568 --> 00:21:14,780 好吧,扰流器警报。 524 00:21:14,780 --> 00:21:16,890 好了,所以从不介意。 525 00:21:16,890 --> 00:21:18,520 这就是答案,未来的问题。 526 00:21:18,520 --> 00:21:21,450 >> 这里是比较-0,和我 要得到一个文本行。 527 00:21:21,450 --> 00:21:22,435 程序要简单得多。 528 00:21:22,435 --> 00:21:23,560 因此,这很简单。 529 00:21:23,560 --> 00:21:28,070 这就好比第一周,第二周的东西 眼下。字符串s = GetString的。 530 00:21:28,070 --> 00:21:29,700 现在,我再说一遍下来这里。 531 00:21:29,700 --> 00:21:31,830 串T = GetString的。 532 00:21:31,830 --> 00:21:35,300 然后,在该过去的事 程序,正如它的名字所暗示的, 533 00:21:35,300 --> 00:21:37,090 是我要尝试对它们进行比较。 534 00:21:37,090 --> 00:21:40,709 >> 因此,如果S,第一个字符串, 等于= T,那么我 535 00:21:40,709 --> 00:21:42,250 要说你输入同样的事情。 536 00:21:42,250 --> 00:21:44,291 否则,我会说 你输入不同的事情。 537 00:21:44,291 --> 00:21:45,880 因此,让我们编译并运行这个程序。 538 00:21:45,880 --> 00:21:48,481 所以要比较为零。 539 00:21:48,481 --> 00:21:48,980 看起来不错。 540 00:21:48,980 --> 00:21:50,490 没有编译错误。 541 00:21:50,490 --> 00:21:52,386 >> 现在让我继续前进 并键入./compare-0。 542 00:21:52,386 --> 00:21:55,230 543 00:21:55,230 --> 00:21:59,220 让我继续前进,说些什么 :Daven和东西:罗伯。 544 00:21:59,220 --> 00:22:00,450 与I型不同的东西。 545 00:22:00,450 --> 00:22:01,250 到目前为止,一切都很好。 546 00:22:01,250 --> 00:22:02,680 程序似乎是正确的。 547 00:22:02,680 --> 00:22:03,880 >> 但是,让我们再次运行它。 548 00:22:03,880 --> 00:22:05,800 说些什么:加布。 549 00:22:05,800 --> 00:22:07,140 说些什么:加布。 550 00:22:07,140 --> 00:22:08,520 551 00:22:08,520 --> 00:22:09,020 好吧。 552 00:22:09,020 --> 00:22:10,851 也许我打空格键 什么时髦。 553 00:22:10,851 --> 00:22:11,600 让我们再做一次。 554 00:22:11,600 --> 00:22:13,020 所以Zamyla。 555 00:22:13,020 --> 00:22:13,970 556 00:22:13,970 --> 00:22:14,470 Zamyla。 557 00:22:14,470 --> 00:22:15,740 558 00:22:15,740 --> 00:22:17,330 不同的东西。 559 00:22:17,330 --> 00:22:19,430 那么到底是怎么回事? 560 00:22:19,430 --> 00:22:23,200 >> 因此,我们有以下两行 代码的GetString被调用两次。 561 00:22:23,200 --> 00:22:25,760 然后,我只是 试图比较s和t。 562 00:22:25,760 --> 00:22:28,370 但真正那么是怎么回事? 563 00:22:28,370 --> 00:22:31,180 嗯,我的手写的要 屠夫这个例子有点。 564 00:22:31,180 --> 00:22:34,630 而且,我们居然丢 这件事在这里,也是如此。 565 00:22:34,630 --> 00:22:37,390 566 00:22:37,390 --> 00:22:45,712 >> 因此,我们必须像一条线 字符串s = GetString的。 567 00:22:45,712 --> 00:22:48,295 所以,这只是第一 有趣的线从该计划中。 568 00:22:48,295 --> 00:22:49,920 569 00:22:49,920 --> 00:22:52,974 但是,这段时间一直 正在进行的引擎盖底下? 570 00:22:52,974 --> 00:22:55,890 以及,在左手侧是字符串, 这是某种类型的变量, 571 00:22:55,890 --> 00:22:56,785 而且它称为S。 572 00:22:56,785 --> 00:23:00,019 所以,我知道,这是使用的内存, 或RAM,在我的电脑不知何故。 573 00:23:00,019 --> 00:23:02,060 所以,我要抽象 绘制一个正方形。 574 00:23:02,060 --> 00:23:04,820 32位的,它的出现,但 更多的是在未来。 575 00:23:04,820 --> 00:23:06,410 然后,这是怎么回事了吗? 576 00:23:06,410 --> 00:23:08,700 >> 那么,很明显的GetString 从用户获取的字符串。 577 00:23:08,700 --> 00:23:11,360 和GetString了 Zamyla或加布或Daven。 578 00:23:11,360 --> 00:23:14,640 因此,让我们选择第一 那些的,这是Daven。 579 00:23:14,640 --> 00:23:19,174 所以,有效,什么的GetString了 我在第一种情况是D-A-V-E-N。 580 00:23:19,174 --> 00:23:22,690 581 00:23:22,690 --> 00:23:25,045 然后,还有什么做 它给我的秘密? 582 00:23:25,045 --> 00:23:25,920 听众:[听不清] 583 00:23:25,920 --> 00:23:28,720 戴维·J·马兰:是啊, 在/ 0或空字符。 584 00:23:28,720 --> 00:23:30,550 因此,有效地给了我一个字符串。 585 00:23:30,550 --> 00:23:34,550 但是,我们已经知道,从以前的 看着一个字符串只是一个数组 586 00:23:34,550 --> 00:23:37,895 字符,它的终止 这个特殊的标记字符,/ 0。 587 00:23:37,895 --> 00:23:39,220 588 00:23:39,220 --> 00:23:42,310 >> 但是,如果这是真 这是一个正方形, 589 00:23:42,310 --> 00:23:44,160 这显然​​是一个更大的矩形。 590 00:23:44,160 --> 00:23:46,830 事实上,这是, 我要求中,只有32位。 591 00:23:46,830 --> 00:23:49,500 而这显然超过32 位,因为这很可能是 592 00:23:49,500 --> 00:23:51,583 八加八加8 加八加八, 593 00:23:51,583 --> 00:23:53,320 只是因为在ASCII码的字节。 594 00:23:53,320 --> 00:23:57,030 到底如何我们要适应 Daven到这里这个小盒子? 595 00:23:57,030 --> 00:23:59,880 >> 那么,什么是GetString的真正在做什么? 596 00:23:59,880 --> 00:24:03,680 好了,该网格在这里代表 我的电脑的内存或RAM。 597 00:24:03,680 --> 00:24:07,564 因此,让我们武断地说,如果 每一个都代表一个字节, 598 00:24:07,564 --> 00:24:09,730 那么,我们能想到的每一个 字节为具有一个地址, 599 00:24:09,730 --> 00:24:13,830 像33牛津街,或34 牛津街,或35牛津街。 600 00:24:13,830 --> 00:24:16,700 >> 所以就像家庭有地址 和建筑物有地址, 601 00:24:16,700 --> 00:24:19,810 这样做的单个字节 记忆有地址或号码 602 00:24:19,810 --> 00:24:21,042 唯一地识别它们。 603 00:24:21,042 --> 00:24:22,000 现在,这是任意的。 604 00:24:22,000 --> 00:24:25,370 但要保持简单,我要 用十六进制只是按照惯例, 605 00:24:25,370 --> 00:24:28,200 但0X意味着什么等 比“,这是十六进制。” 606 00:24:28,200 --> 00:24:31,030 而我要去声称, “D”结束于字节的一个存储器中。 607 00:24:31,030 --> 00:24:34,210 >> 我没有什么其他的事情 内存,所以Daven拿到了第一个景点 608 00:24:34,210 --> 00:24:35,509 在字节之一。 609 00:24:35,509 --> 00:24:36,800 那么,这将是0X2。 610 00:24:36,800 --> 00:24:37,831 611 00:24:37,831 --> 00:24:38,705 这会为0x3。 612 00:24:38,705 --> 00:24:39,840 613 00:24:39,840 --> 00:24:41,800 这将是为0x4。 614 00:24:41,800 --> 00:24:43,025 这是要为0x5。 615 00:24:43,025 --> 00:24:44,025 这将是为0x6。 616 00:24:44,025 --> 00:24:45,560 617 00:24:45,560 --> 00:24:48,290 >> 但是,一旦你开始思考 什么电脑做的 618 00:24:48,290 --> 00:24:50,710 引擎盖下方, 你就可以开始来推断 619 00:24:50,710 --> 00:24:54,960 怎么啦,几年前,会 有C本身实现的。 620 00:24:54,960 --> 00:24:58,360 什么是可能的GetString returning--因为它 621 00:24:58,360 --> 00:25:00,946 感觉这不是 返回Daven,本身 622 00:25:00,946 --> 00:25:03,320 因为他肯定不会 适合在这个小box-- 623 00:25:03,320 --> 00:25:05,090 那么,什么是可能的GetString返回? 624 00:25:05,090 --> 00:25:07,958 625 00:25:07,958 --> 00:25:08,920 >> 听众:[听不清] 626 00:25:08,920 --> 00:25:10,540 >> 戴维·J·马兰:Daven的位置。 627 00:25:10,540 --> 00:25:12,770 而且它已经这样做 自从第一周。 628 00:25:12,770 --> 00:25:16,150 什么GetString的是真的 返回不是字符串,本身。 629 00:25:16,150 --> 00:25:17,780 那是善意的谎言之一。 630 00:25:17,780 --> 00:25:22,520 它返回的地址 串在存储器中,唯一的地址。 631 00:25:22,520 --> 00:25:24,820 Daven住在33牛津街。 632 00:25:24,820 --> 00:25:29,310 但更简洁,加文·生活 在为0x1,地址一号。 633 00:25:29,310 --> 00:25:32,280 >> 那么,被放在这个 小盒子那么,要清楚, 634 00:25:32,280 --> 00:25:35,930 是字符串的仅仅是地址。 635 00:25:35,930 --> 00:25:38,110 所以这一切的时候,这 已经持续。 636 00:25:38,110 --> 00:25:41,650 但是,这暗示 现在,如果所有S有 637 00:25:41,650 --> 00:25:44,710 是一个数字,它里面,谁的 阻止你,程序员, 638 00:25:44,710 --> 00:25:47,970 从把任何数目的 任何变量,只是跳 639 00:25:47,970 --> 00:25:49,080 到的内存块? 640 00:25:49,080 --> 00:25:51,320 事实上,我们可以看到 这是一个威胁下一次。 641 00:25:51,320 --> 00:25:53,500 >> 但现在,这种感觉不足。 642 00:25:53,500 --> 00:25:55,630 如果我说,让我 字符串,你给我Daven。 643 00:25:55,630 --> 00:25:57,230 但是,你真的不给我Daven。 644 00:25:57,230 --> 00:25:59,310 所有你给我的是Daven的地址。 645 00:25:59,310 --> 00:26:04,310 我怎么那么肯定知道 其中Daven开始和ends-- 646 00:26:04,310 --> 00:26:07,140 故事的越来越weird-- 其中Daven的开始和结束, 647 00:26:07,140 --> 00:26:10,435 然后,下一个 字符串在内存中开始? 648 00:26:10,435 --> 00:26:11,520 649 00:26:11,520 --> 00:26:13,620 >> 好吧,如果你递过 我Daven的开始, 650 00:26:13,620 --> 00:26:17,230 基本上,我怎么知道 在那里他的名字到底是? 651 00:26:17,230 --> 00:26:20,550 特别空字符,这 是更重要的,现在 652 00:26:20,550 --> 00:26:23,040 如果下面的字符串 引擎盖只是确定 653 00:26:23,040 --> 00:26:25,820 通过唯一地在存储器中的位置。 654 00:26:25,820 --> 00:26:28,130 所以这一切的时候,那是 什么是怎么回事。 655 00:26:28,130 --> 00:26:32,470 >> 所以,当我们现在看 这里的代码,解释 656 00:26:32,470 --> 00:26:35,790 如果你会在第26行的错误。 657 00:26:35,790 --> 00:26:39,560 为什么Zamyla和Zamyla有什么不同? 658 00:26:39,560 --> 00:26:41,330 为什么加布和加布有什么不同? 659 00:26:41,330 --> 00:26:42,154 是的,在后面。 660 00:26:42,154 --> 00:26:43,390 >> 听众:他们有不同的地址。 661 00:26:43,390 --> 00:26:45,931 >> 戴维·J·马兰:很简单,因为 他们有不同的地址。 662 00:26:45,931 --> 00:26:48,820 当你调用GetString的,因为 再次,我会尽快在这里, 663 00:26:48,820 --> 00:26:52,870 如果这是第二行,串 T,因为我在该程序中一样, 664 00:26:52,870 --> 00:26:55,030 等于另一个电话给GetString。 665 00:26:55,030 --> 00:26:56,370 666 00:26:56,370 --> 00:26:58,670 下一次我打电话 GetString的,我要去 667 00:26:58,670 --> 00:27:00,190 以得到不同的块的内存。 668 00:27:00,190 --> 00:27:02,220 >> GetString的允许 问工作 669 00:27:02,220 --> 00:27:03,800 系统越来越多的内存。 670 00:27:03,800 --> 00:27:07,894 它不会重复使用相同的 六个字节每一次。 671 00:27:07,894 --> 00:27:09,810 这将得到一个新的 块的存储器,其中 672 00:27:09,810 --> 00:27:12,780 装置吨是会得到 其他一些价值在这里。 673 00:27:12,780 --> 00:27:15,380 >> 所以,当我做s等于= T,你不比较 674 00:27:15,380 --> 00:27:17,880 ð对这个和A对 这和V反对这一点。 675 00:27:17,880 --> 00:27:19,588 你这个比较 针对这一点,这 676 00:27:19,588 --> 00:27:24,020 坦率地说是相当useful-- useless-- 没什么用,因为谁真正 677 00:27:24,020 --> 00:27:25,830 关心那里的字符串在内存中? 678 00:27:25,830 --> 00:27:26,850 >> 事实上,我们还没有。 679 00:27:26,850 --> 00:27:28,980 我们不是要 启动特别关怀。 680 00:27:28,980 --> 00:27:34,180 只是在某种程度上,错误可能出现 与安全的威胁可能会出现意志 681 00:27:34,180 --> 00:27:36,100 我们真正开始关心这个。 682 00:27:36,100 --> 00:27:37,230 因此,让我们解决这个问题。 683 00:27:37,230 --> 00:27:39,650 事实证明,你解决它超级简单。 684 00:27:39,650 --> 00:27:42,600 >> 而且,我们其实之前,我 再次表明,会是什么 685 00:27:42,600 --> 00:27:47,170 怎么做,如果在CS50类, 你不得不实施 686 00:27:47,170 --> 00:27:48,600 对两个字符串进行比较。 687 00:27:48,600 --> 00:27:51,440 你显然不能仅仅用s等于= T。 688 00:27:51,440 --> 00:27:54,090 但是,仅仅从逻辑上讲,如何 你比较这串 689 00:27:54,090 --> 00:27:56,370 不要使用C代码这个字符串? 690 00:27:56,370 --> 00:27:56,880 是啊。 691 00:27:56,880 --> 00:27:58,780 >> 听众:刚才做的 for循环[听不清] 692 00:27:58,780 --> 00:28:00,670 693 00:28:00,670 --> 00:28:01,670 戴维·J·马兰:完美。 694 00:28:01,670 --> 00:28:02,900 听众:[听不清] 695 00:28:02,900 --> 00:28:03,310 戴维·J·马兰:是的。 696 00:28:03,310 --> 00:28:05,390 只需使用一个for循环或 while循环或什么的。 697 00:28:05,390 --> 00:28:08,710 但就应用的基本想法,如果 这是内存或阵列的块 698 00:28:08,710 --> 00:28:11,590 这就是,遍历 二者在同一时间。 699 00:28:11,590 --> 00:28:12,960 而只比较字母。 700 00:28:12,960 --> 00:28:14,260 >> 而且你必须是一个 小心一点,因为你 701 00:28:14,260 --> 00:28:16,247 不想一个手指 晃过对方 702 00:28:16,247 --> 00:28:18,080 因为一个字符串 比其他的长。 703 00:28:18,080 --> 00:28:21,380 所以你会想检查 在年底这个特殊的值,则返回null。 704 00:28:21,380 --> 00:28:24,017 但它确实是,在 最后,就这么简单。 705 00:28:24,017 --> 00:28:26,100 坦率地说,我们不需要 重新发明了车轮。 706 00:28:26,100 --> 00:28:27,960 下面是两个版本。 707 00:28:27,960 --> 00:28:32,910 什么我要在这里说的是, 而不是比较s等于= T, 708 00:28:32,910 --> 00:28:38,964 我反而要说,如果字符串 第逗号吨相比等于= 0。 709 00:28:38,964 --> 00:28:40,130 现在,什么是字符串比较? 710 00:28:40,130 --> 00:28:43,046 >> 事实证明,这是一个函数, 带有C,其目的在生活中 711 00:28:43,046 --> 00:28:44,650 要比较两个字符串。 712 00:28:44,650 --> 00:28:48,300 搅拌相比,如果我们读了 手册页或文档或CS50 713 00:28:48,300 --> 00:28:50,630 参考,它会 简单的告诉你,搅 714 00:28:50,630 --> 00:28:55,730 比较收益或者负 数或正数或零, 715 00:28:55,730 --> 00:28:57,660 其中零表示他们是平等的。 716 00:28:57,660 --> 00:28:58,570 >> 所以只是猜测。 717 00:28:58,570 --> 00:29:00,390 可能是什么意思,如果 搅拌收益比较 718 00:29:00,390 --> 00:29:02,110 负值或正值? 719 00:29:02,110 --> 00:29:02,785 720 00:29:02,785 --> 00:29:04,285 听众:大于或小于。 721 00:29:04,285 --> 00:29:05,570 戴维·J·马兰:是啊, 大于或小于。 722 00:29:05,570 --> 00:29:08,640 所以,如果你想整个排序 在dictionary--一串字符串 723 00:29:08,640 --> 00:29:12,975 因为我们最终会下来road-- 完善的功能,潜在的使用, 724 00:29:12,975 --> 00:29:15,850 因为它要做到这一点 比较字符串给你,并告诉 725 00:29:15,850 --> 00:29:20,060 你做了来自前B,或不 b来之前,按字母顺序排列。 726 00:29:20,060 --> 00:29:21,490 我们正是这样做。 727 00:29:21,490 --> 00:29:23,620 >> 而且请注意,我没有一个其他 在本实施例中的事情。 728 00:29:23,620 --> 00:29:26,870 什么改变了更高的 在这个主要的功能? 729 00:29:26,870 --> 00:29:28,500 730 00:29:28,500 --> 00:29:29,350 char *的。 731 00:29:29,350 --> 00:29:31,150 而这是其他善意的谎言。 732 00:29:31,150 --> 00:29:33,750 这一切的时候,当你 在写字符串, 733 00:29:33,750 --> 00:29:38,350 我们一直在偷偷改写 字符串为char *,这样实际上铿锵 734 00:29:38,350 --> 00:29:39,270 理解你。 735 00:29:39,270 --> 00:29:42,450 >> 换句话说,在CS50.h 当我们最终会看到, 736 00:29:42,450 --> 00:29:45,950 我们做了一个代名词叫做字符串 这是同样的事情为char *。 737 00:29:45,950 --> 00:29:49,910 而现在,只有在知道 *,在这种情况下,至少 738 00:29:49,910 --> 00:29:51,286 装置的地址。 739 00:29:51,286 --> 00:29:52,210 >> 什么样的报告? 740 00:29:52,210 --> 00:29:56,390 嗯,事实上,我说的 char *的,而不是int *或浮动* 741 00:29:56,390 --> 00:30:00,820 也就是说char *的是 一个字符的地址。 742 00:30:00,820 --> 00:30:06,770 所以这里这个小盒子,又名 字符串,是真的char *类型, 743 00:30:06,770 --> 00:30:10,490 这是说只是一个奇特的方式, 在此框中会去的地址。 744 00:30:10,490 --> 00:30:12,430 并且这是什么地址是指? 745 00:30:12,430 --> 00:30:13,780 显然,一个char。 746 00:30:13,780 --> 00:30:16,410 >> 但是,我们绝对可以 必须是int *和其他的东西。 747 00:30:16,410 --> 00:30:20,790 但现在,char *的是最真的 直接的和感兴趣的。 748 00:30:20,790 --> 00:30:23,310 所以这个问题是要 上升,不过,一次。 749 00:30:23,310 --> 00:30:24,830 >> 假设我打开了这个节目。 750 00:30:24,830 --> 00:30:27,670 让我们来看看现在我们可以预测 有什么不对的代码。 751 00:30:27,670 --> 00:30:31,140 所以这个方案,复制0,我 要继续前进,并再次呼吁 752 00:30:31,140 --> 00:30:34,190 GetString的并存储在s的值。 753 00:30:34,190 --> 00:30:38,800 >> 然后,我为什么这样做, 只是从过去几周的提醒? 754 00:30:38,800 --> 00:30:40,960 我们确实说的GetString 有时,则返回null。 755 00:30:40,960 --> 00:30:42,793 是什么意思,如果 的形式返回空值? 756 00:30:42,793 --> 00:30:45,040 757 00:30:45,040 --> 00:30:46,034 出事了。 758 00:30:46,034 --> 00:30:48,950 这可能意味着该字符串是太 大,计算机的内存不足。 759 00:30:48,950 --> 00:30:51,724 它发生超,超,超 很少,但它可能发生。 760 00:30:51,724 --> 00:30:53,890 我们要检查它, 这就是我们所做的。 761 00:30:53,890 --> 00:30:57,910 >> 因为我们现在看到的,如果你不这样做 开始检查习惯性的东西 762 00:30:57,910 --> 00:31:00,870 像空,你可能 真正开始去 763 00:31:00,870 --> 00:31:03,106 到存储器中的地址是无效的。 764 00:31:03,106 --> 00:31:05,980 而你要开始诱导 越来越多的细分故障。 765 00:31:05,980 --> 00:31:08,360 或者在Mac还是PC,只要 使计算机挂起 766 00:31:08,360 --> 00:31:10,340 或程序冻结,有可能。 767 00:31:10,340 --> 00:31:14,930 >> 所以,现在,我要求在复制0.c,我 现在要通过的方式来复制这些字符串 768 00:31:14,930 --> 00:31:15,685 线28。 769 00:31:15,685 --> 00:31:16,850 770 00:31:16,850 --> 00:31:18,750 然后,我会 如权利要求在底部 771 00:31:18,750 --> 00:31:21,430 在这里,我要 改变其中之一。 772 00:31:21,430 --> 00:31:22,330 >> 所以注意到这一点。 773 00:31:22,330 --> 00:31:24,370 我打电话是我们的老朋友strlen的。 774 00:31:24,370 --> 00:31:28,960 而在英语只是解释 这行34是干什么的? 775 00:31:28,960 --> 00:31:32,480 什么吨支架0 表示在左边。 776 00:31:32,480 --> 00:31:32,980 是啊。 777 00:31:32,980 --> 00:31:34,339 >> 听众:T的第一个字符? 778 00:31:34,339 --> 00:31:35,880 戴维·J·马兰:T的第一个字符。 779 00:31:35,880 --> 00:31:36,379 就是这样。 780 00:31:36,379 --> 00:31:40,024 吨的第一个字母,我想 指定的大写版本 781 00:31:40,024 --> 00:31:41,190 在吨的第一个字符。 782 00:31:41,190 --> 00:31:43,200 因此,这是资本 第一个字母。 783 00:31:43,200 --> 00:31:46,340 然后,在最后一件事,我做的 在这个计划是我要求这里的 784 00:31:46,340 --> 00:31:50,340 原来,S,和这里的副本,T。 785 00:31:50,340 --> 00:31:54,610 >> 但根据故事我们只是 说什么串真的是, 786 00:31:54,610 --> 00:31:57,520 什么是28行真的 做的,什么是 787 00:31:57,520 --> 00:31:59,405 所产生的错误会 要在屏幕上? 788 00:31:59,405 --> 00:32:01,300 789 00:32:01,300 --> 00:32:03,500 >> 因此,首先,第一个问题,28。 790 00:32:03,500 --> 00:32:09,040 什么是串T = S真的在做什么? 791 00:32:09,040 --> 00:32:16,430 如果我们有在左手 这里边串T = S; 792 00:32:16,430 --> 00:32:19,400 这给了我一个盒子 在这里,一个盒子在这里。 793 00:32:19,400 --> 00:32:25,530 并假设该地址是0X, 比方说,50这时候,随意。 794 00:32:25,530 --> 00:32:28,847 什么串T = S 做引擎盖底下? 795 00:32:28,847 --> 00:32:30,340 >> 听众:[听不清] 796 00:32:30,340 --> 00:32:34,100 >> 戴维·J·马兰:它存储在内存中 有地址,所以为0x50去那里。 797 00:32:34,100 --> 00:32:37,980 所以,如果现在我去的第一个 字符T和大写的, 798 00:32:37,980 --> 00:32:39,535 我是什么切实做送? 799 00:32:39,535 --> 00:32:41,300 800 00:32:41,300 --> 00:32:43,450 我真的做同样的事情,对不对? 801 00:32:43,450 --> 00:32:47,680 因为如果地址0x50--,只是,我 没有太多空间在黑板上这里, 802 00:32:47,680 --> 00:32:51,750 但假设这是0X50到这里, 某处在我的电脑的内存中。 803 00:32:51,750 --> 00:32:55,825 >> 而我,比如,加布 在这里小写,这样。 804 00:32:55,825 --> 00:32:57,120 805 00:32:57,120 --> 00:33:01,980 我已经说过吨支架 0被资本化。 806 00:33:01,980 --> 00:33:04,860 嗯,T支架0 T中的第一个字母。 807 00:33:04,860 --> 00:33:07,840 所以,小克将要 成为大湾但是问题 808 00:33:07,840 --> 00:33:09,410 是,是什么而是也指向? 809 00:33:09,410 --> 00:33:10,300 >> 听众:相同。 810 00:33:10,300 --> 00:33:11,841 >> 戴维·J·马兰:同样的事情。 811 00:33:11,841 --> 00:33:16,342 因此,一个简单的解释或许是, 即使语法是有点怪异。 812 00:33:16,342 --> 00:33:17,050 因此,让我们做到这一点。 813 00:33:17,050 --> 00:33:20,210 使复制的0,然后./copy-0。 814 00:33:20,210 --> 00:33:21,820 815 00:33:21,820 --> 00:33:24,110 说些什么:加布。 816 00:33:24,110 --> 00:33:26,760 不幸的是,这两个 他们现在已经被资本化, 817 00:33:26,760 --> 00:33:29,500 但对于基本 原因是我们根本 818 00:33:29,500 --> 00:33:32,350 现在要处理的地址。 819 00:33:32,350 --> 00:33:36,470 >> 那么,我们如何开始 address--没有双关语intended-- 820 00:33:36,470 --> 00:33:39,270 我们该如​​何着手解决 这方面的问题? 821 00:33:39,270 --> 00:33:44,400 那么,在copy1.c,事情进展 变得有点复杂。 822 00:33:44,400 --> 00:33:49,310 但我会要求 概念上很简单的解决方案。 823 00:33:49,310 --> 00:33:50,852 >> 所以很难得到乍一看。 824 00:33:50,852 --> 00:33:53,560 不是一件容易的事为先 一次打出来,也许, 825 00:33:53,560 --> 00:33:57,440 但是,如果该问题是 简单地做T =的只有我 826 00:33:57,440 --> 00:33:59,694 复制地址什么的, 再次,如果我可以选择你, 827 00:33:59,694 --> 00:34:02,110 将是解决方案 在实际拷贝的字符串? 828 00:34:02,110 --> 00:34:04,906 829 00:34:04,906 --> 00:34:06,770 >> 听众:我们可能会 再次使用一个循环。 830 00:34:06,770 --> 00:34:06,890 >> 戴维·J·马兰:是的。 831 00:34:06,890 --> 00:34:08,390 所以,我们要再次需要一个循环。 832 00:34:08,390 --> 00:34:11,800 而且,因为如果我们想复制 一个字符串s转换另一个字符串, 833 00:34:11,800 --> 00:34:14,120 我们可能想这样做 逐字符。 834 00:34:14,120 --> 00:34:17,199 但问题是,如果 这本来是S, 835 00:34:17,199 --> 00:34:22,159 现在我们需要明确启动 在t分配内存。 836 00:34:22,159 --> 00:34:24,320 >> 换句话说,让我们 重绘这是最后一次。 837 00:34:24,320 --> 00:34:28,659 如果是字符串s = GetString的。 838 00:34:28,659 --> 00:34:30,956 839 00:34:30,956 --> 00:34:32,455 让我们把这个在这里,也是如此。 840 00:34:32,455 --> 00:34:36,639 841 00:34:36,639 --> 00:34:37,420 这是GetString的。 842 00:34:37,420 --> 00:34:39,070 843 00:34:39,070 --> 00:34:43,860 然后,画面的东西 像将是象以前那样 844 00:34:43,860 --> 00:34:44,360 G-A-B-E-/ 0。 845 00:34:44,360 --> 00:34:47,294 846 00:34:47,294 --> 00:34:48,960 这看起来有点像这样。 847 00:34:48,960 --> 00:34:53,650 和S因此,我们称这种为0x50, 那将是51,52。 848 00:34:53,650 --> 00:34:54,409 >> 因此,这是为0x50。 849 00:34:54,409 --> 00:34:55,679 850 00:34:55,679 --> 00:34:59,690 然后,我做的串T。 851 00:34:59,690 --> 00:35:02,450 在内存方面,这只是将 给我这样一个小广场。 852 00:35:02,450 --> 00:35:04,080 那么什么是关键的一步呢? 853 00:35:04,080 --> 00:35:09,870 如果我想复制s转换T,什么 空白,我们需要在这里填写? 854 00:35:09,870 --> 00:35:12,050 或者是什么,我们需要 做在一个较高的水平? 855 00:35:12,050 --> 00:35:14,101 856 00:35:14,101 --> 00:35:14,600 是吗? 857 00:35:14,600 --> 00:35:16,200 858 00:35:16,200 --> 00:35:17,020 有人在吗? 859 00:35:17,020 --> 00:35:17,690 是啊。 860 00:35:17,690 --> 00:35:19,214 >> 听众:我们需要[听不清]。 861 00:35:19,214 --> 00:35:21,380 戴维·J·马兰:是的,我们 需要填写这个空白。 862 00:35:21,380 --> 00:35:24,340 我不能复制,然后 利用Gabe的名字 863 00:35:24,340 --> 00:35:28,120 直到我问操作系统 对于内存另一块 864 00:35:28,120 --> 00:35:30,640 这至少一样大的原稿。 865 00:35:30,640 --> 00:35:32,130 所以这给我们留下了一个问题。 866 00:35:32,130 --> 00:35:36,080 >> 我如何向操作系统不 只是一个简单的小pointer-- 867 00:35:36,080 --> 00:35:38,530 因为这是所谓的,一个 地址,pointer--不 868 00:35:38,530 --> 00:35:40,980 一个简单的小盒子 像这样所谓的一个字符串? 869 00:35:40,980 --> 00:35:44,200 我怎么问工作 系统内存一大块? 870 00:35:44,200 --> 00:35:48,430 到目前为止,我只得到了回 间接调用GetString的。 871 00:35:48,430 --> 00:35:50,740 因此,如何的GetString 即使得到它的内存? 872 00:35:50,740 --> 00:35:53,430 >> 嗯,事实证明,有 这个其他的功能在这里 873 00:35:53,430 --> 00:35:55,160 那我们现在就开始使用。 874 00:35:55,160 --> 00:35:59,780 现在,这种方式看起来更神秘than-- 我是谁可以看到它 - 唯一一个 875 00:35:59,780 --> 00:36:03,150 这条线看上去方式更隐蔽 那么就应该第一眼。 876 00:36:03,150 --> 00:36:04,650 但是,让我们逗它拆开。 877 00:36:04,650 --> 00:36:07,950 >> 在左边,我的char *吨。 878 00:36:07,950 --> 00:36:13,280 因此,在英语,让我们开始制定 正确的句子中的技术术语。 879 00:36:13,280 --> 00:36:19,757 因此,这是分配 char类型的变量*称为T。 880 00:36:19,757 --> 00:36:21,090 现在,这究竟意味着什么? 881 00:36:21,090 --> 00:36:23,881 >> 那么,这意味着,我该怎么 把这个变量称为T? 882 00:36:23,881 --> 00:36:24,780 883 00:36:24,780 --> 00:36:26,402 一个字符的地址。 884 00:36:26,402 --> 00:36:28,360 所以,这仅仅是简单的, 更合理的方式 885 00:36:28,360 --> 00:36:29,930 的说明的左手侧。 886 00:36:29,930 --> 00:36:32,890 因此,创建这个盒子在这里只。 887 00:36:32,890 --> 00:36:34,760 这样的右手侧, 据推测,是怎么回事 888 00:36:34,760 --> 00:36:37,170 分配的大 内存块是如何? 889 00:36:37,170 --> 00:36:38,340 因此,让我们取笑这个分开。 890 00:36:38,340 --> 00:36:41,131 >> 它压倒性的第一眼, 但是这是怎么回事里面吗? 891 00:36:41,131 --> 00:36:43,740 首先,有malloc的,这 显然是我们的新朋友, 892 00:36:43,740 --> 00:36:45,450 “内存分配”。 893 00:36:45,450 --> 00:36:49,560 因此,这是传递的参数 进去,所以这是一个相当大的争论。 894 00:36:49,560 --> 00:36:50,970 因此,让我们取笑这个分开。 895 00:36:50,970 --> 00:36:53,410 >> 当然,第strlen的,代表the-- 896 00:36:53,410 --> 00:36:54,142 897 00:36:54,142 --> 00:36:55,600 听众:字符数。 898 00:36:55,600 --> 00:36:56,710 戴维·J·马兰:就在 s中的字符数。 899 00:36:56,710 --> 00:36:59,040 所以s的长度,原来的字符串。 900 00:36:59,040 --> 00:37:00,350 因此,G-A-B-E。 901 00:37:00,350 --> 00:37:02,320 因此,它可能是在这里为四个。 902 00:37:02,320 --> 00:37:05,485 之后我为什么要做1 调用第strlen的? 903 00:37:05,485 --> 00:37:06,360 听众:[听不清] 904 00:37:06,360 --> 00:37:07,590 戴维·J·马兰:对于 特殊的空字符。 905 00:37:07,590 --> 00:37:11,260 如果你问我什么是长度 Gabe的名字,我会说,四名。 906 00:37:11,260 --> 00:37:14,480 在系统底层,不过,我需要 在第五个字节的空字符。 907 00:37:14,480 --> 00:37:16,100 所以这就是为什么我做了1。 908 00:37:16,100 --> 00:37:21,730 >> 现在,以防万一你运行这个 程序的计算机比其他的,说, 909 00:37:21,730 --> 00:37:24,610 在CS50家电, 其中一个字符的大小 910 00:37:24,610 --> 00:37:26,350 可能是不同 从我自己的computer-- 911 00:37:26,350 --> 00:37:30,590 事实证明,我可以把这个 运营商的sizeof,只是问了电脑, 912 00:37:30,590 --> 00:37:32,870 什么是a的大小 char的这台电脑上? 913 00:37:32,870 --> 00:37:37,400 >> 并通过在此乘以5 例如,通过一个字符的大小,这 914 00:37:37,400 --> 00:37:40,440 在大多数计算机上会 仅仅是一个,malloc的 915 00:37:40,440 --> 00:37:44,830 是要分配给我这个大 内存块在这里就对了。 916 00:37:44,830 --> 00:37:47,140 而这将return-- 它是一个函数 - 所以它的 917 00:37:47,140 --> 00:37:48,265 要回到我身边吗? 918 00:37:48,265 --> 00:37:50,914 919 00:37:50,914 --> 00:37:51,830 听众:地址? 920 00:37:51,830 --> 00:37:53,709 戴维·J·马兰:什么样的报告? 921 00:37:53,709 --> 00:37:55,250 听众:内存是分配呢? 922 00:37:55,250 --> 00:37:56,450 戴维·J·马兰:的 它的内存分配。 923 00:37:56,450 --> 00:37:59,189 所以,我不知道,坦白地说, 这是怎么回事结束了。 924 00:37:59,189 --> 00:38:01,480 我要建议 这将结束在均为0x88。 925 00:38:01,480 --> 00:38:02,770 926 00:38:02,770 --> 00:38:06,009 完全是任意的,但 什么地方比其他的0x50, 927 00:38:06,009 --> 00:38:08,800 因为操作系统,什么 Windows和Mac OS为我做的,是 928 00:38:08,800 --> 00:38:11,230 请确保它给 我的内存不同的块。 929 00:38:11,230 --> 00:38:14,210 >> 因此,这是价值所在今 内存块可能最终。 930 00:38:14,210 --> 00:38:16,060 原来这就是在这里,均为0x88结束。 931 00:38:16,060 --> 00:38:17,480 932 00:38:17,480 --> 00:38:21,570 所以,现在清楚了,我能理解 这是不一样的,因为这, 933 00:38:21,570 --> 00:38:23,960 因为他们指着 不同组块的存储器。 934 00:38:23,960 --> 00:38:29,980 所以,如果我现在真的想复制此 在,让我们做你的建议的解决方案。 935 00:38:29,980 --> 00:38:36,870 >> 让我们只是去创建一个for循环, 和做T支架í得到Š支架岛 936 00:38:36,870 --> 00:38:39,760 因为现在我可以使用 这阵般的符号, 937 00:38:39,760 --> 00:38:43,390 因为即使非常的malloc 一般我分配内存, 938 00:38:43,390 --> 00:38:45,290 内存只是连续的字节。 939 00:38:45,290 --> 00:38:47,240 字节,字节,字节,回背靠背。 940 00:38:47,240 --> 00:38:50,030 >> 我可以肯定,作为一个程序员 把它当作一个数组,其中 941 00:38:50,030 --> 00:38:55,090 意味着我可以用这个终于熟悉 符号只是一些方括号。 942 00:38:55,090 --> 00:38:56,462 943 00:38:56,462 --> 00:39:00,020 >> 因此,让我停在那里,因为 这是很多一次性全部,甚至 944 00:39:00,020 --> 00:39:03,530 虽然基本思路重温 是字符串,这一切的时候, 945 00:39:03,530 --> 00:39:05,550 是不是一个新的数据类型本身。 946 00:39:05,550 --> 00:39:10,150 这只是一个所谓的指针, 一个字符的地址, 947 00:39:10,150 --> 00:39:12,650 这只是意味着它是一个数字 由人约定 948 00:39:12,650 --> 00:39:15,350 我们倾向于写为0X的东西。 949 00:39:15,350 --> 00:39:18,590 >> 但是,这只是一个数字, 像33牛津街, 950 00:39:18,590 --> 00:39:20,530 这恰好是 政务司司长建筑物的地址。 951 00:39:20,530 --> 00:39:22,000 952 00:39:22,000 --> 00:39:23,545 对这些细节有问题吗? 953 00:39:23,545 --> 00:39:24,790 954 00:39:24,790 --> 00:39:25,289 是吗? 955 00:39:25,289 --> 00:39:28,530 >> 听众:我们为什么检查 在t等于null? 956 00:39:28,530 --> 00:39:30,740 >> 戴维·J·马兰:为什么我们 检查吨等于null? 957 00:39:30,740 --> 00:39:33,250 如果我们读了documentation-- 对malloc的伟大question--, 958 00:39:33,250 --> 00:39:37,020 它会在印刷精美的说, 有时候可能的malloc返回null, 959 00:39:37,020 --> 00:39:38,080 就像GetString的。 960 00:39:38,080 --> 00:39:41,820 事实上,形式返回空值 如果反过来,malloc的返回null, 961 00:39:41,820 --> 00:39:43,130 因为GetString的使用的malloc。 962 00:39:43,130 --> 00:39:46,400 >> 和可能,如果操作系统发生, 的Mac OS,Windows中,无论是简单的 963 00:39:46,400 --> 00:39:48,130 出内存给你。 964 00:39:48,130 --> 00:39:49,820 所以,这就是发生在那里。 965 00:39:49,820 --> 00:39:52,910 >> 并且让我发现一件事 这可能只是打击你的心 966 00:39:52,910 --> 00:39:55,100 或者完全是太远了就行了。 967 00:39:55,100 --> 00:39:59,770 不过,让我拉起来 同样的for循环复制, 968 00:39:59,770 --> 00:40:05,480 其中,刚才被召回 这个。吨级​​别I得到Š支架岛 969 00:40:05,480 --> 00:40:06,740 >> 尼斯和用户友好。 970 00:40:06,740 --> 00:40:09,330 再次感觉就像第二周。 971 00:40:09,330 --> 00:40:14,920 但这个版本其实是可以 写成这样,看起来神秘。 972 00:40:14,920 --> 00:40:18,280 这是一个技术,称为指针 算术,地址运算。 973 00:40:18,280 --> 00:40:19,600 但是为什么这工作? 974 00:40:19,600 --> 00:40:22,220 >> 现在烦人的 的C笔者决定使用 975 00:40:22,220 --> 00:40:25,070 *符号为不同的目的。 976 00:40:25,070 --> 00:40:29,020 我们已经看到了使用一次已, char *的,意思是“给我一个变量 977 00:40:29,020 --> 00:40:31,210 那将包含 一个字符的地址。“ 978 00:40:31,210 --> 00:40:33,990 在这方面如此的char * 意思是“给我一个变数。” 979 00:40:33,990 --> 00:40:40,050 >> 不幸的是,如果您使用不带* 在它前面的单词,如焦炭, 980 00:40:40,050 --> 00:40:41,905 它现在被称为 引用操作。 981 00:40:41,905 --> 00:40:43,530 我们会看到更多这样用不了多久。 982 00:40:43,530 --> 00:40:44,930 但它只是意味着“去那里。” 983 00:40:44,930 --> 00:40:49,070 这就像说,如果有人递给我 在一张纸“33牛津街” 984 00:40:49,070 --> 00:40:53,830 如果我做“* 33牛津街,”这意味着 “走在路上到CS的建设。” 985 00:40:53,830 --> 00:40:57,220 >> 因此,*的意思只是去那里,如果 还有就是在它前面没有字。 986 00:40:57,220 --> 00:40:59,100 那么,什么是T,要清楚? 987 00:40:59,100 --> 00:41:03,250 t是该块的地址 这是还给我的记忆。 988 00:41:03,250 --> 00:41:06,650 s是什么,要明确的地址, 在这个例子中,我们一直在讨论, 989 00:41:06,650 --> 00:41:07,500 小写加布? 990 00:41:07,500 --> 00:41:08,990 991 00:41:08,990 --> 00:41:10,005 s是地址of-- 992 00:41:10,005 --> 00:41:11,585 993 00:41:11,585 --> 00:41:12,460 听众:字符串。 994 00:41:12,460 --> 00:41:14,126 作者加布的原名:戴维·马兰。 995 00:41:14,126 --> 00:41:16,660 所以它的地址 这个块的存储器。 996 00:41:16,660 --> 00:41:22,220 所以,如果我说T +我 - 我的通知, 只是我们的老朋友了。 997 00:41:22,220 --> 00:41:24,770 这只是一个索引变量 这是从零上了迭代 998 00:41:24,770 --> 00:41:26,960 到的字符串s的长度。 999 00:41:26,960 --> 00:41:30,367 因此,这将是零,再一个, 然后二,然后三天,4。 1000 00:41:30,367 --> 00:41:33,200 因此,让我们组装这些新 从无到有,就像拼图游戏一样,如果你愿意, 1001 00:41:33,200 --> 00:41:36,140 即使再次,语法 远比划痕更晦涩难懂。 1002 00:41:36,140 --> 00:41:39,522 因此,t是一个地址+ i的要给我 1003 00:41:39,522 --> 00:41:42,480 数,因为这些都是 我们已经制订为十六进制数。 1004 00:41:42,480 --> 00:41:43,560 但他们只是数字。 1005 00:41:43,560 --> 00:41:49,960 >> 因此,如果T的地址,我们说 为均为0x88,什么均为0x88加零。 1006 00:41:49,960 --> 00:41:51,564 1007 00:41:51,564 --> 00:41:53,980 即使你不舒服 用十六进制然而,以此来猜测。 1008 00:41:53,980 --> 00:41:54,410 >> 听众:原来。 1009 00:41:54,410 --> 00:41:55,850 >> 戴维·J·马兰:仍然均为0x88。 1010 00:41:55,850 --> 00:41:58,910 那么,是什么*均为0x88是什么意思? 1011 00:41:58,910 --> 00:42:02,670 这意味着,“去那里”,这意味着 有效,“把你的手指在这里。” 1012 00:42:02,670 --> 00:42:06,930 和现在的右手侧 该表达式中,*,然后在括号, 1013 00:42:06,930 --> 00:42:11,586 S + i表示s,这是 这里的小克解决了。 1014 00:42:11,586 --> 00:42:16,220 S + 0,当然,S,不管s是。 1015 00:42:16,220 --> 00:42:21,230 >> 所以,现在,它的* s,这就像* 33 牛津街是指去的地址 1016 00:42:21,230 --> 00:42:22,010 第 1017 00:42:22,010 --> 00:42:24,170 因此,这里的这个手指,右手。 1018 00:42:24,170 --> 00:42:26,050 那我要复制到什么? 1019 00:42:26,050 --> 00:42:30,260 在右侧的事情,这是 加布,在这里,小克,到这里。 1020 00:42:30,260 --> 00:42:32,750 >> 那等的影响 在循环的第一次迭代中, 1021 00:42:32,750 --> 00:42:36,200 如你提出,尽管它看起来 疯狂的比什么都更复杂 1022 00:42:36,200 --> 00:42:42,110 我们已经看到过,只是说 到这里,并在这里复制该字符。 1023 00:42:42,110 --> 00:42:44,700 它给你一张地图两个位置。 1024 00:42:44,700 --> 00:42:46,130 >> 我们将看到更为了这一点。 1025 00:42:46,130 --> 00:42:50,600 但现在,希望仅仅是 介绍其中的一些基本思路。 1026 00:42:50,600 --> 00:42:53,550 事实上,让我们来看看 最后一个节目在这里, 1027 00:42:53,550 --> 00:42:57,480 然后承诺的粘土动画, 这将使得一切都还好吗。 1028 00:42:57,480 --> 00:42:57,980 好吧。 1029 00:42:57,980 --> 00:43:01,680 因此,让我开up--我们走吧。 1030 00:43:01,680 --> 00:43:02,850 1031 00:43:02,850 --> 00:43:05,440 因此,让我 - 我们会回来的 到不久这张图片。 1032 00:43:05,440 --> 00:43:08,360 让我开了这个最后的例子在这里。 1033 00:43:08,360 --> 00:43:09,440 1034 00:43:09,440 --> 00:43:12,710 >> 因此,这里是一个超级,超级 程序完成 1035 00:43:12,710 --> 00:43:15,050 没有在生活中,做了以下几点。 1036 00:43:15,050 --> 00:43:18,740 它首先声明两个变量,X 和y即不是数字此时, 1037 00:43:18,740 --> 00:43:19,240 本身。 1038 00:43:19,240 --> 00:43:20,448 他们不是整数,本身。 1039 00:43:20,448 --> 00:43:22,899 他们显然是int *。 1040 00:43:22,899 --> 00:43:25,690 所以只要任何人,这是什么意思 如果你的数据类型,你的变量, 1041 00:43:25,690 --> 00:43:26,860 是的类型是int *星? 1042 00:43:26,860 --> 00:43:30,240 这是一个int的地址。 1043 00:43:30,240 --> 00:43:31,990 >> 所以,我不知道它在哪儿呢。 1044 00:43:31,990 --> 00:43:35,150 它只是意味着“最终, 这里的int的地址。“ 1045 00:43:35,150 --> 00:43:38,340 为0x50,均为0x88,无论它是在 存储器中,地址是要在那里。 1046 00:43:38,340 --> 00:43:40,200 而这正是y是 将要,以及。 1047 00:43:40,200 --> 00:43:44,920 >> 如果我现在说,X =的malloc(sizeof运算(INT)), 这是说,一个奇特的方式, 1048 00:43:44,920 --> 00:43:49,000 哎操作系统通过malloc, 给我足够的内存的大小 1049 00:43:49,000 --> 00:43:52,370 一个int,这可能是 将是32位或4个字节。 1050 00:43:52,370 --> 00:43:53,680 >> 那么,是什么的malloc返回? 1051 00:43:53,680 --> 00:43:55,250 malloc的返回地址。 1052 00:43:55,250 --> 00:43:57,020 那么,什么会得到存放在X? 1053 00:43:57,020 --> 00:44:00,600 的组块的地址 存储器,四个字节,该malloc的 1054 00:44:00,600 --> 00:44:03,360 刚发现我问 操作系统。 1055 00:44:03,360 --> 00:44:08,240 >> 现在同时在线 4在此,* X = 42。 1056 00:44:08,240 --> 00:44:09,990 只是要清楚, 这是怎么回事那里? 1057 00:44:09,990 --> 00:44:11,530 在左手侧,* X。 1058 00:44:11,530 --> 00:44:13,610 这就像* 33牛津街。 1059 00:44:13,610 --> 00:44:15,523 因此,* X意味着什么? 1060 00:44:15,523 --> 00:44:16,450 >> 听众:去。 1061 00:44:16,450 --> 00:44:17,908 >> 戴维·J·马兰:进入该地址。 1062 00:44:17,908 --> 00:44:20,466 无论那一块 记忆,去它。 1063 00:44:20,466 --> 00:44:21,979 放什么在那里,很明显? 1064 00:44:21,979 --> 00:44:22,520 听众:42。 1065 00:44:22,520 --> 00:44:23,580 戴维·J·马兰:42。 1066 00:44:23,580 --> 00:44:25,650 好吧,* Y,同样的想法。 1067 00:44:25,650 --> 00:44:26,860 转到Y中的地址。 1068 00:44:26,860 --> 00:44:31,740 把13号在那里, 但为y的时刻? 1069 00:44:31,740 --> 00:44:33,172 1070 00:44:33,172 --> 00:44:34,630 听众:有没有记忆的年。 1071 00:44:34,630 --> 00:44:35,710 戴维·J·马兰:有 对Y没有记忆。 1072 00:44:35,710 --> 00:44:38,215 那么什么是ÿ可能 包含,因为我们一直在说什么? 1073 00:44:38,215 --> 00:44:38,520 >> 听众:垃圾。 1074 00:44:38,520 --> 00:44:39,480 >> 戴维·J·马兰:一些垃圾值。 1075 00:44:39,480 --> 00:44:41,320 现在,垃圾的价值仍然是一个数字。 1076 00:44:41,320 --> 00:44:43,160 它仍然可以被误认为是一个地址。 1077 00:44:43,160 --> 00:44:45,160 就好像一个人 潦草的东西了, 1078 00:44:45,160 --> 00:44:48,002 我误解了它的意思 一些建筑在街上。 1079 00:44:48,002 --> 00:44:50,460 如果你只是试图进入 一些建筑物不属于您, 1080 00:44:50,460 --> 00:44:53,710 或一些内存块,你有没有 已经给出不好的事情可能会发生。 1081 00:44:53,710 --> 00:44:57,740 计算机可能会崩溃,或者一些其他的 未确定的行为可能会发生。 1082 00:44:57,740 --> 00:45:01,310 >> 所以,前奏的话,要宾基是这样的。 1083 00:45:01,310 --> 00:45:04,290 我还记得,20 一些多年后, 1084 00:45:04,290 --> 00:45:07,200 我在那里的时候,我终于 理解指针。 1085 00:45:07,200 --> 00:45:09,520 >> 这就是说,如果 离开这里在三分钟 1086 00:45:09,520 --> 00:45:12,170 而以为我不 理解指针,实现 1087 00:45:12,170 --> 00:45:14,410 我记得20 年,一些疯狂的原因 1088 00:45:14,410 --> 00:45:17,140 何时以及为什么它最后沉没 中,坐在我的教学 1089 00:45:17,140 --> 00:45:19,501 老乡,尼沙特梅塔在 艾略特食堂回来。 1090 00:45:19,501 --> 00:45:21,250 现在,我想起了 这是因为,这是 1091 00:45:21,250 --> 00:45:23,920 的主题时,我在一个 特别是,挣扎。 1092 00:45:23,920 --> 00:45:26,470 然后,它最后点击, 像我敢说很多话题 1093 00:45:26,470 --> 00:45:27,460 最终会的。 1094 00:45:27,460 --> 00:45:32,590 而现在,以使该感到所有的 更快乐,更让人信服, 1095 00:45:32,590 --> 00:45:35,360 让我们在最后我们看一下 最后三分钟,在这里宾基, 1096 00:45:35,360 --> 00:45:37,675 从我们的朋友,尼克 Parlante来自​​斯坦福大学。 1097 00:45:37,675 --> 00:45:38,910 1098 00:45:38,910 --> 00:45:41,580 >> [视频回放] 1099 00:45:41,580 --> 00:45:42,750 >> 嘿,宾基。 1100 00:45:42,750 --> 00:45:43,500 醒来! 1101 00:45:43,500 --> 00:45:45,960 现在是时候为指针乐趣。 1102 00:45:45,960 --> 00:45:47,012 >> - 什么是什么? 1103 00:45:47,012 --> 00:45:48,723 了解指针? 1104 00:45:48,723 --> 00:45:50,580 噢,好极了! 1105 00:45:50,580 --> 00:45:53,563 >> - 嗯,上手的,我想我们 将需要几个三分球。 1106 00:45:53,563 --> 00:45:54,390 >> - 确定。 1107 00:45:54,390 --> 00:45:57,930 此代码分配两个三分球, 它可以指向整数。 1108 00:45:57,930 --> 00:45:58,430 - 确定。 1109 00:45:58,430 --> 00:46:02,140 嗯,我看到两个三分球,但他们 似乎并没有被指向任何东西。 1110 00:46:02,140 --> 00:46:02,980 >> - 这就是正确的。 1111 00:46:02,980 --> 00:46:05,100 最初,指针 不指向任何东西。 1112 00:46:05,100 --> 00:46:08,030 他们指出,被称为东西 指针对象,并设置他们的 1113 00:46:08,030 --> 00:46:09,370 一个单独的步骤。 1114 00:46:09,370 --> 00:46:10,220 >> 哦,对,对。 1115 00:46:10,220 --> 00:46:10,950 我知道这一点。 1116 00:46:10,950 --> 00:46:12,385 该指针对象是分开的。 1117 00:46:12,385 --> 00:46:14,315 呃,那么你如何分配指针对象? 1118 00:46:14,315 --> 00:46:15,340 1119 00:46:15,340 --> 00:46:15,960 >> - 确定。 1120 00:46:15,960 --> 00:46:18,970 那么,这个代码分配 一个新的整数指针对象, 1121 00:46:18,970 --> 00:46:20,950 而这部分设置x指向它。 1122 00:46:20,950 --> 00:46:22,050 1123 00:46:22,050 --> 00:46:23,230 >> 嘿,这看起来更好。 1124 00:46:23,230 --> 00:46:25,060 因此,利用它做些什么。 1125 00:46:25,060 --> 00:46:25,990 >> - 确定。 1126 00:46:25,990 --> 00:46:30,455 我将间接引用指针x可 数字42存入及其指针。 1127 00:46:30,455 --> 00:46:32,830 对于这一招,我需要我的 提领的魔术棒。 1128 00:46:32,830 --> 00:46:34,130 1129 00:46:34,130 --> 00:46:36,080 >> 解引用的 - 你的魔术棒? 1130 00:46:36,080 --> 00:46:37,357 1131 00:46:37,357 --> 00:46:38,190 That--这是伟大的。 1132 00:46:38,190 --> 00:46:39,340 1133 00:46:39,340 --> 00:46:41,080 >> - 这是什么样的代码如下所示。 1134 00:46:41,080 --> 00:46:44,110 我会刚刚成立的号码,[流行] 1135 00:46:44,110 --> 00:46:44,700 >> 嘿,快看。 1136 00:46:44,700 --> 00:46:46,140 就这样吧。 1137 00:46:46,140 --> 00:46:50,980 >> -so做一个提领在X如下 箭头访问及其指针。 1138 00:46:50,980 --> 00:46:53,160 在这种情况下,存储器42在那里。 1139 00:46:53,160 --> 00:46:57,710 嘿尝试使用它来存储数 13穿过另一个指针,Y。 1140 00:46:57,710 --> 00:46:58,760 >> - 确定。 1141 00:46:58,760 --> 00:47:03,270 我就投奔这里Y, 并获得了13号成立。 1142 00:47:03,270 --> 00:47:07,930 然后,采取的魔杖 非关联化和公正[叮咚] 1143 00:47:07,930 --> 00:47:08,960 >> - 哦! 1144 00:47:08,960 --> 00:47:09,500 >> 哦,嘿嘿! 1145 00:47:09,500 --> 00:47:11,090 没有工作。 1146 00:47:11,090 --> 00:47:15,630 说,宾基,我不认为提领 y是一个好主意,因为你知道, 1147 00:47:15,630 --> 00:47:17,850 建立指针对象 是一个独立的步骤。 1148 00:47:17,850 --> 00:47:20,450 而且我不认为我们曾经做到了。 1149 00:47:20,450 --> 00:47:21,480 >> - 良好的点。 1150 00:47:21,480 --> 00:47:21,980 是啊。 1151 00:47:21,980 --> 00:47:25,680 我们分配的指针,Y,但我们 从来没有把它设置为指向一个指针对象。 1152 00:47:25,680 --> 00:47:27,190 1153 00:47:27,190 --> 00:47:28,616 >> - 非常细心。 1154 00:47:28,616 --> 00:47:30,240 嘿,你看起来好有,宾基。 1155 00:47:30,240 --> 00:47:33,400 你可以解决它,从而y点 到相同的指针对象为x? 1156 00:47:33,400 --> 00:47:34,000 >> -sure。 1157 00:47:34,000 --> 00:47:36,780 我会用我的魔杖 的指针赋值。 1158 00:47:36,780 --> 00:47:38,740 >> -is那将是 像以前一样的问题吗? 1159 00:47:38,740 --> 00:47:39,240 - 没有。 1160 00:47:39,240 --> 00:47:40,660 这不碰指针对象。 1161 00:47:40,660 --> 00:47:44,450 它只是改变了自己的指针 指向同样的事情又。 1162 00:47:44,450 --> 00:47:45,450 >> 哦,我明白了。 1163 00:47:45,450 --> 00:47:48,200 现在Ÿ指向同一个地方为x。 1164 00:47:48,200 --> 00:47:48,910 所以等待。 1165 00:47:48,910 --> 00:47:49,950 现在,Y是固定的。 1166 00:47:49,950 --> 00:47:51,120 它有一个指针对象。 1167 00:47:51,120 --> 00:47:54,510 所以,你可以尝试的魔杖 提领一次送13以上。 1168 00:47:54,510 --> 00:47:56,510 >> -Uh,确定。 1169 00:47:56,510 --> 00:47:58,160 在这里不言而喻。 [流行] 1170 00:47:58,160 --> 00:47:59,340 >> 嘿,看看这个。 1171 00:47:59,340 --> 00:48:00,750 现在提领Y上的作品。 1172 00:48:00,750 --> 00:48:04,991 而由于指针分享 一个指针对象,他们都看到了13。 1173 00:48:04,991 --> 00:48:05,490 是啊。 1174 00:48:05,490 --> 00:48:06,870 共享,等等。 1175 00:48:06,870 --> 00:48:08,820 那么,我们现在要切换的地方? 1176 00:48:08,820 --> 00:48:09,440 >> 哦,你看。 1177 00:48:09,440 --> 00:48:10,830 我们没时间了。 1178 00:48:10,830 --> 00:48:11,570 >> -But-- 1179 00:48:11,570 --> 00:48:13,530 >> - 只是记住三个指针的规则。 1180 00:48:13,530 --> 00:48:16,560 第一,基本结构 是你有一个指针, 1181 00:48:16,560 --> 00:48:18,680 它指出了一个指针对象。 1182 00:48:18,680 --> 00:48:20,640 但指针和 指针对象是分开的, 1183 00:48:20,640 --> 00:48:22,610 和常见的错误 是要建立一个指针, 1184 00:48:22,610 --> 00:48:25,000 但忘了给它一个指针对象。 1185 00:48:25,000 --> 00:48:28,170 >> 第二,指针废弃 开始于指针 1186 00:48:28,170 --> 00:48:31,050 并沿用其在箭头 访问及其指针。 1187 00:48:31,050 --> 00:48:33,400 大家都知道,这 只有当有 1188 00:48:33,400 --> 00:48:36,270 指针对象,哪一种 变回规则一。 1189 00:48:36,270 --> 00:48:39,000 >> 第三,指针 任务需要一个指针 1190 00:48:39,000 --> 00:48:42,320 并将其更改为指向 同样的指针对象作为另一个指针。 1191 00:48:42,320 --> 00:48:44,160 因此,在转让之后, 这两个指针 1192 00:48:44,160 --> 00:48:45,910 将指向同一个指针对象。 1193 00:48:45,910 --> 00:48:47,990 有时候,这就是所谓的共享。 1194 00:48:47,990 --> 00:48:49,740 而这一切就是这么简单,真的。 1195 00:48:49,740 --> 00:48:50,277 再见了。 1196 00:48:50,277 --> 00:48:51,110 [完视频回放] 1197 00:48:51,110 --> 00:48:52,568 戴维·J·马兰:这就是它的CS50。 1198 00:48:52,568 --> 00:48:55,110 我们会看到你下周。 1199 00:48:55,110 --> 00:48:56,064