[音乐播放] DAVID J.马兰:这就像 一个新生研讨会今天。 行。 因此大雨了。 这往往发生在星期三, 但所有的更多机会 对于今天的问题。 因此,让我们开始实际 有一会儿就好了这部电影。 但是,我们将隆重启动一如既往。 这是CS50,这 是4周结束。 所以,如果你曾经看过 电视或电影,其中 有一些计算机专家, 警察,或者FBI,或者一些机构 试图捕捉一些 对手,嗯,你已经 大概听过这句话“提升” 因此该技术人员不知何故 神奇地放大无限 远远的看到歹徒 身份或车牌号 在镜子连微光 或某人的眼睛闪闪发光。 因此,我们确实,让我们一起来看看 一些这样的场景从好莱坞。 [视频回放] - 确定了,现在让我们好好看看你。 -拿住。 运行该回来了。 -等待一分钟。 向右走。 -there,冻结。 -全屏。 - 确定,冻结。 向上拧得过紧上,你会? - 矢量在上 小伙的后轮。 -zoom在这里在这一点上。 - 随着合适的设备,图像 可以扩大和激化。 -那是什么? - 它是一个提升计划。 - 你能清楚地表明了没有? -我不知道。 让我们增强了。 - 增强部分A6。 -I增强了细节, 而且 - 我认为有 足以提升, 它释放到我的屏幕。 -I增强了她的眼睛反射。 - 让我们通过运行此 视频增强。 -Edgar,你可以加强这方面的? -不挂断。 -I've这方面的工作思考。 -Someone的反思。 - 反射。 - 存在就是男人的脸的反映。 -The反映。 - 存在的一种反映。 - 放大上镜。 - 你可以看到一个反映。 - 你能在这里提升形象? - 你能提高他在这里? - 你能提升呢? 你能提升呢? - 能,我们加强这方面的? - 你能提升呢? -hold在第二,我会提高。 - 放大在门上。 -Times 10。 -zoom。 -move研究。 -更多。 -Wait,停止。 -停止。 -pause它。 -rotate我们75度 绕垂直,请。 -停止。 返回到部分 关于门,再一次。 -Got图像增强器,可以位图? - 嘿,也许我们可以使用普拉迪普 森方法来查看到窗口。 - 此软件是最先进的。 -The特征值是关闭的。 - 随着权 算法 - 组合 - 他的采取淘汰 算法,以一个新的水平, 我可以用它们来 加强这方面的照片。 -lock上和放大z轴。 - 增强。 - 增强。 - 增强。 -freeze和提高。 [结束播放] DAVID J.马兰:所有的权利,所以 所有这些实际上都是字。 他们只是串联系在一起, 的方式,实际上不是明智的。 而且,事实上,CS50和课程喜欢它 往往会毁了很多电视和电影 为了你。 因为当这些电脑专家 在剑拔弩张关条款,并说 喜欢花哨的东西 特征向量,和z轴, 和任何数量的其它的 其实更多的技术术语, 他们真的只是串起 字联太频繁。 那是我们的希望之一是, 作为疗程服用的副作用 像这样,将更多的人在 世界上居然能权衡 而只是非常轻微影响 质量和这些膜的准确性? 事实上,让我们来看看现实。 因此,这里的工作人员合影 玛利亚,我们的教学研究员之一。 而假设她是 怀疑的东西。 然而,还有一丝 一些的证据在她的眼睛, 还是在她的眼镜的反映。 那么,如果我们这样做完全一样的电影 建议,其中,我们缩放和“提升”, 这是多少信息 在玛丽的脸上 当你拍摄图像 与原始分辨率。 而且,事实上,你可以看到这些点。 这些都是什么 称为像素,P-I-X-E-L-S, 这仅仅是一个典型的方 这是一个圆点组成的图像。 而早在一天,居然连 今天与当今一些LED电视 或液晶电视,如果你有 一个在你的房间或在家里, 如果你去了超级靠近它, 尤其是如果它是一个有些旧的电视, 你甚至可能看到这些点 而这正是构成的图像。 并且没有更多的 信息莫过于此。 我们可以“提高”,在感 平滑的事情了排序和 推断那种类型的,什么 颜色应该是旁边的Mary的眼睛 因此,它实际上不是这样的像素化。 但是,如果我继续放大,有 是个坏家伙在她的眼睛。 就像是所有的 我们掌握的。 您不能创建 信息无中生有。 这里只有一个有限 位存在的数目。 因此,在习题集4,其中 你有一个机会 用这种世界玩。 在习题4,你会探索 图形和取证的世界, 实际上编写代码 即恢复丢失的图像。 你会写代码, 操纵现有图像 最终明白什么是 怎么回事引擎盖下。 而且,事实证明,它实际上 不是所有的那么复杂。 举例来说,如果我们想 代表笑脸的地方 这些黑色像素, 或者这些黑点, 好了,我们可以简单地表示 他们作为一个真正的位图。 如果你曾经听说过 表达位图,也许 现在开始做一个 一点更有意义的今天。 我们已经知道什么是位。 它是0或1。 而地图只是一些 像一张纸 ,让你的方向,并具有 也许x和y坐标的网格。 因此,这里是一个位图。 它是比特的地图 由此1是显然 要代表白色像素和 0是要表示黑像素。 但是,我们当然可以翻转它周围。 它并不真正的问题等等 只要我们是一致的。 这里是怎么回事,在binary--内 计算机的存储器中,或甚至内部 在您的硬盘的文件 drive--你能存储 的笑脸图像的简单。 但当然,我们是什么, 缺乏这一形象? 颜色,对不对? 这是一个明显的下一个步骤或 增强的色彩改善这一点。 所以,不幸的是,只是一个单一 位,0或1,我们可以表示的颜色。 这可能是红色或蓝色,或 黑或白,或绿,或粉红色, 或对颜色。 但是,为了简单起见,我们将 姑且黑色和白色。 那么在逻辑上我们需要,如果我们 要实现彩色图像中的? 什么是我们必须做的? 就像如果这里的限制因素 是与一位你只能 表示两个状态,0或1,白 或黑色的,你有什么想干什么? 听众:更多的数据。 DAVID J.马兰:更多位, 耶更多的数据,更多的比特。 而且,事实上,这也正是如何 彩色图像表示。 而不是使用单个比特,一 0或1对于每个像素,每个点, 你只需要使用多个。 也许使用8,也许,更常见 使用24,而事实上,在习题集 4,将你的文件播放 使用24位典型的格式。 但大多数你可能 熟悉的JPEG文件。 如果你曾经拍摄 照片在手机上, 或者上载或看到的东西 Facebook或Flickr的,任何数量 照片为基础的网站,你 之前可能看到一个JPEG图像。 而事实证明,这是文件 格式我们会在PSET 4使用, 因此你要 要恢复图像 我不小心从已删除 在摄像机损坏的存储卡, 如果你愿意。 而事实证明,即使 JPEG是相当sophisticated-- 它的更复杂 比黑和白点 我们看到刚才,因为有 实际上看中的算法, 被用于压缩为JPEG,所以 你可以有一个非常好的, 高质量的图像,但使用 相当少的比特。 我们再回过头来 不久压缩。 事实证明,在第一 在一个JPEG image--三个字节 无论你所拍摄的照片 of--是值255,216,255。 换句话说,如果你只是 看到位的模式, 这里为三 字节或24比特合计, 高概率,你可以推断, 你看它这前三 一个JPEG字节。 这是什么是已知的 为JPEG的签名。 大量的文件格式 在那里往往开始 用0和1的某些模式, 因此,Windows和Mac OS,和iOS, 和Android知道什么样的文件,他们 是,除了所谓的文件 扩展了很多文件都有。 如果您的.jpg,这是 另一线索到计算机。 现在让我们看看这个 多一点技术。 我们知道小数 系统是0到9。 我们知道二进制是0和1。 如果你觉得回到PSET 0,我们有你角力, 一点点,东西 所谓的十六进制, 在这里你有16位数字, 而不是10或代替2-。 而这些数字,按照惯例, 为0至9,然后一个 通过f,其中f代表什么 十进制数,只是作为一个快速神智 检查? 这样,15。 而一个必须代表10,只凭 我已经给订货的性质。 这只是一个任意的约定, 但是它是相当标准。 因此,如果我们看一下这个模式 三bytes--我们 刚开始看它 用怎样的方式 计算机科学家一般 看待和思考的文件。 你当然可以考虑一下 在0文件,和1,和小数, 但在现实中,我们往往会使用二进制 或更典型地hexadecimal-- 回程从PSET 0。 因此,让我提出,255,216,255 是0和1的只是这些模式。 你可以,如果检查这个你 想从第0周做数学题。 不过,就目前来看,只是假设 这确实是正确的。 我刚刚改写三个小数 数字作为3的二进制值。 现在我所要做的就是 只需添加一些白色的空间, 只是可读性的缘故。 而通知,我只是去 搬东西分开。 所以前,后,前,后。 我在做什么有趣其他 不仅仅是传播的东西出这么 该通知每组八 位现在是两组四比特。 这是因为,十六进制有用 特别时尚 因为每一个十六进制数字0〜 f或者更具体地为0到15, 可以表示 恰好有四位。 换句话说,在十六进制如果 想表示一个0,它只是0000, 四个零。 如果你要代表15, 它是1111,这是4位。 如果你做数学题, 如果这是个位, 这是16S的地方, 那将会给你 - 而这回事 用于:对不起,二进制, 那将会给你15,个位, 三三两两的地方,四肢和八分的地方。 因此,让我提议说 在左侧设置四个比特的 就是我们要调用F。 这是最大的号码,你 可以用四位表示。 我们已经从十六进制知道, f是十六进制的最大数字。 我们已经有了另一个F那里, 两个在那边。 而现在,只需要信仰 我已经做了数学向右 并且左半 那些位,1101, 是同样的事情为d十六进制。 而右手,1000年,仅有8。 而一个人的易见,对吧? 8 represents--是正确的 下面的八分地方。 所以我们有一个在八分列 并没有在四肢着地,三三两两或1。 所以现在更多的传统,人们往往 写十六进制这样的数字, 你刚才压碎在一起, 然后以0x前缀他们。 这意味着什么比其他 视觉线索一human-- 又来了一个十六进制value--因为 它可能没有另外明显。 这就是说,最终, 零和一的图案, 或十六进制的模式 数字等价的你 要开始寻找 在习题集4 this-- 和习题集4规范将走 您通过本更detail-- 但作为实现某种神秘的作为 这可能看起来乍一看, 你将开始看到这个有很多。 而事实上,即使是在GDB中, 调试器,我们推出了周一 和丹介绍了PSET 3,是怎么回事 经常告诉你的十六进制值 只是因为他们往往​​更 传统不是十进制或二进制 在计算机的世界。 现在,让我们把这个的来龙去脉。 你们中许多人可能还记得这个 图片浏览,它来自什么? Vista的,所以还要早 认为,Windows XP这样做首次亮相。 因此,这是一道亮丽的风景。 而事实上,如果你闲逛online-- 我认为这是一个维基百科的文章, 其中有人很令人惊讶出去 发现这个位置在世界上成立 他或她的在相机 恰到好处的place-- 这看起来今天like--但 它是完全一样的设置。 这个图象,不过,是在一个文件中 格式称为位图,B-M-页。 而且我们要采取超 快速浏览一下这是什么意思。 但是,位图是只是用不同的方式 代表图像仍然采用像素 在0和1,最终。 但在快速浏览,它有 一个更有趣的签名 在文件的开头。 这不是短短三年 字节,而还有 一大堆的字节模式 已经预定义。 例如,某处 位图图像的前几个字节 将是的大小 图像时,图像的宽度, 图像的高度,因此 有用的元数据,如果你愿意。 有用信息的Photoshop 或任何图形您正在使用编程 也许真的在乎。 因此,更多的关于这方面 问题集4中,但此 只说 在一天结束时 你一直在使用的文件格式 对于years-- Microsoft Word文件, 数字文件,Excel文件, 任意数量的文件格式 可能有一些 已知文件扩展名 只是0和1的引擎盖下。 而人类已经决定 什么样的约定, 什么样的0和1的模式代表 一个Word文件与一个Excel文件, 与任意数量的其他文件格式。 因此,在PSET 4,你就会有一个 机遇与发挥。 但是,什么意思有一个结构。 这实际上是一个很好的SEGUE现在 成C,它只有一对夫妇 附加功能 我们还没看呢。 这是一个非常小的语言之一 关于C的不错的功能,是一个结构。 例如,如果你 想represent--我们 说你想有一个变量 代表一个学生的一些计划。 也许你正在写一门课程 注册程序,或核心购物 工具,或者类似的东西。 什么是数据块相关 一个学生浮现在脑海? 就像一个学生 代表有什么样的价值观? 是吗? 你有一个名字作为一个学生。 还有什么不典型的学生有哪些? 听众:[听不清] DAVID J.马兰:所以,对不起。 听众:年龄。 DAVID J.马兰:一个时代或 生日等效,是的。 还有什么? 听众:身份证号码? DAVID J.马兰:所以一个ID号,也许 一个电话号码,也许是一个宿舍,或房子, 或学院,或类似的东西。 任何数目的数据段是 你可能在你的联系人列表 是可以定义一个学生。 因此,如果我们要做到这一点,在代码中, 我们可以做一些简单的像这样。 我们可能有一个程序, 有让我们说,诠释主要(无效)。 如果我想代表 学生,我可能有,比如, 一个名为名字的学生字符串, 一个名为宿舍为学生串, 也许一个int称为ID为学生。 而且因为我使用的字符串,我 需要回去并提出了CS50.h. 也许我会需要stdio.h中。 因此,让我抢先做那些和我 要调用这个student.c现在 并保存。 现在我能做些什么 这些变量。 而我们只是写 随着伪代码中的注释, 因为它不是有趣 我们做什么现在。 好了,这是一个程序, 不知何故存储的学生。 什么是我想要做的,如果我 要存储两位学生? 所以,我的第一反应是怎么回事 就可以了吧,等一下, 如果我有一个学生,为什么不要我 只是做字符串名称2,串宿舍2, INT ID2。 而我们所做的走了 下来之前,这条道路 什么是我们的解决方案似乎什么 是怎样的一个hackish的复制粘贴的 在这里工作? 听众:数组。 DAVID J.马兰:是啊, 我们可以使用的阵列。 右键这个速度非常快 就不明智了。 你要排序的任意 开始命名所有这些变量。 而你,人类,必须保持 跟踪该行名2对应 与dorm2对应ID2。 它只是变得一团糟。 所以这是一个容易得多, 从几个星期前还记得, 只是不得不叫字符串名称 也许给我们其中的三个。 然后,也许我们有 串宿舍和有 三个,或具有恒定, 诠释ID和有三个那些。 但即便是现在这样的感觉 一个有点草率了吧。 我们谈论的是学生,但 我真的沉湎于低水平 实施细则。 学生是一个名称,一个宿舍和ID。 为什么我不能只是声明一个变量 所谓的学生,称之为秒。 如果我想另一名学生, 为什么不让我只是把它吨。 或者,如果我想要一大堆 学生,为什么不让我 说我有一整类 同学们,这是他们三个。 换句话说,为什么不能我来了 与我自己的数据类型,称为 学生,其内部是 一个名字,是一个ID,是一个宿舍, 任何数量等领域。 而事实证明,你 可正是这样做的。 所以C有这个功能叫做结构。 这是一个语言功能, 让我们做的正是这一点。 我要继续前进 并开辟structs.h 在这里,我们将看到的 以下是学生的定义。 事实证明 - 而这其中甚至 比一个涉及ID简单 刚才。 如果你要来了 自制的数据类型, 而除了int和char和 浮起并所有这些其他人的存在, 你可以从字面上这样做 写typedef结构, 然后一些大括号, 这里面你 列出你想要的变量 这一新的自定义数据相关联 像键入一个名称和宿舍, 再经过大括号 你给一个名称为新的数据类型。 因此,例如,学生。 什么是好的关于这个现在是, 如果我们看一下相应的代码, 该公约,第一 所有的人,是把这个 在一个名为什么点H, 一个头文件,我们有没有 开始使用自己太多。 但是,我们要开始 使用相当多的现在。 而且我们可以用这个做的, 最终,在这几行代码 正是如此声明 数据类型,一个学生。 现在,让我们使用它。 我要现在进入 一个名为structs1.c。 让我们来看看一个 几个特点在这里。 所以的东西在这里是 大多是熟悉的,我们会 回过头来究竟是不是 熟悉一会儿就好了。 当然,这是包括我自己 头文件,它是新的,以及, 除了PSET 3,其中, 回想一下,我们有helpers.h。 所以,你可能还记得的#include helpers.h。 但为什么我使用引号 而不是尖括号? 我什么时候他们之间做出选择? 几乎总是我似乎 使用尖括号。 然后,突然之间就 六号线我使用双引号。 为什么会这样呢? 是吗? 听众:[听不清] DAVID J.马兰:这是一个实际的,是什么? 听众:这是在你的IDE。 DAVID J.马兰:是啊, 这是在我的实际IDE。 而且我们不要对IDE纠缠,因为 这只是我使用的工具。 那是在我目前 目录,明确。 所以structs.h是我自己的文件 没有安装IDE, 在操作系统本身, 而它在我的当前目录。 所以,如果你想要的约定 包括您自己的头文件, 你只需要使用双引号。 什么是我们所说的这个东西 8号线,一般来讲? 这是什么? #定义的东西。 这代表常数,对不对? 如果你想有一个 在你的程序价值 您使用一个整体 一堆的时候,它的 良好的约定因素出来, 声明它,用井号 定义的话,按照惯例,在所有 大写word--尽管它不是 绝对必要的,但 这是人类的约定 充分利用常数 使他们跳出 你visually--空间 那么你想要的值是 相当于恒定的名字。 别无分号,但是你根本 按照该模式存在。 那么,我在此实际代码执行。 因此,让我们一起来看看 这里的主要程序。 在第12行,因为我 已包括structs.h, 我现在已经奇迹般地在我 处置一个新的数据类型。 我不只是有机会获得INT, 和炭,和float和字符串, 和蓝色等。 我现在有机会获得 一个学生的数据类型。 因此,在第12行,我将两个 ideas--一项所述的自定义数据类型和两个, 使用阵列。 所以,在这个项目中,如果 我想实际支持 三个不同的学生 在我的计划,我 可以简单地说,给我一个变量 称为学生,其每一个 是类型的学生,哪个 是我的自定义数据类型。 而且,具体而言,给我 其中三个在我的阵列。 所以,现在我们做这个节目在哪? 这里只是一个for循环迭代 从0到3,因为这是 什么样的学生的价值。 我只是提示用户 给我的学生的名字。 然后在第17行,我们 有大多熟悉线路。 我们有我们的老朋友 GetString的右侧。 什么一块语法 显然是新的, 如果你以前从来没有编入C, 并且从未使用过的结构? 是吗? 听众:本。名称。 DAVID J.马兰:本。名称。 但是,这不是一个太大的飞跃, 因为现在的学生括号我 为您提供了第i个学生。 如果你想潜水 该结构的内部, 你只需要使用一个周期, 那么变量内的名称, 或内部的财产 你想获得访问。 同样的话,如果我再提示 用户,给我的学生的宿舍, 你同样可以存储 字符串里面的宿舍变量 那学生结构。 现在事情变得有点奇特。 这是要去看看 在或许很多太快了。 但是你会看到这么远更PSET 4,所以我们只在它一眼吧。 事实证明,在第23行至 38,你觉得什么我可能做什么? 我已经删除了评论 今天,但版本 网上的代码的 参考已全部评论。 我似乎在做? 听众:保存所有文件 该用户输入的信息。 DAVID J.马兰:是啊, 准确地说,这是一种新的方式 我们现在看到的二, 的C另一个特征, 因此我可以创建自己的文件。 到目前为止,几乎每一个程序 你写的是无状态的。 一旦它完成运行,仅此而已。 有没有记忆或它的回忆。 有没有保存的文件。 但是,如果你想 节约投入,有 事情发生了,就像在游戏或程序 这样,事实证明我们可以做到这一点。 你会看到这更 在PSET 4节。 但是,这条线23实质上 创建一个名为students.csv文件。 你可能已经看到过这一点。 即使你以前从来没有学CS, CSV是逗号分隔的变量。 这就像一个非常贫穷的人的 版本的Excel文件, 这意味着它可以打开 在Excel和苹果的数字, 它具有的行和列。 但它不是一个专有 格式如微软或苹果。 它只是逗号分隔 价值观,我们将看到一个时刻。 而只是采取一种猜测。 在第23行,在最 最后,我的第二个参数 这个所谓的新功能 F打开文件打开是瓦特 什么可能W¯¯表示? 是吗? 听众:它可以让​​你写文件? DAVID J.马兰:它可以让 你写入文件。 因此,有几个变种 我们可以在这里插上研究。 但如果你只是想读 该文件,也就是看它 并读入内存, 只需使用报价引文结束“R”。 如果你想要写的 文件,可以使用报价引文结束“W”。 还有追加和 几个其他的事情 如果要修改现有的文件。 现在,我们将继续看到这 的东西,那么我们会回来到线24。 NULL,它的出现,是 一个特殊值, 可以通过某些功能被返回 如果事情已经wrong-- 如果该文件不存在, 如果你耗尽内存, 或一堆其他错误。 但现在,让我们姑且认为这 仅仅是传统的错误检查。 在这里,在第26行,我遍历 从0到3在所有我的学生。 这是一种排序 一个新的功能,fprintf中, 而只是采取一种猜测。 如果printf的只是打印 一个格式化字符串, 是什么fprintf中大概是什么意思? 听众:打印到文件中。 DAVID J.马兰:打印 格式化字符串到一个文件中。 这就是另外的 F表示是文件。 而新的第一个参数必须是 这表示您的文件中的变量。 然后,我们只是有一个格式 就像printf的字符串。 即使这 语法是新的,这只是 是指插在学生的姓名, 插件在学生宿舍,然后 用fclose函数,关闭文件。 然后lastly--这是新的 我们会回来的这 long--我释放前 学生的原因 发生了上面有。 但是,我们会回来的 该前long-- 这是因为GetString的是如何 实际工作引擎盖下。 因此,让我们快速浏览一下这里。 如果我在目录中输入ls, 请注意,我不 有一个名为students.csv文件, 只是不存在,不存在。 所以,如果我现在编译这个程序, 使结构-1。 /结构-1, 而且我要继续前进,键入 岸堤,谁住在伯克利,耶鲁。 我们将不得不抢谁 住在塞耶这些天。 而且,我们拿出其中, 是的,我想,玛丽亚是在马瑟 如果我没记错。 所以好像没有什么改变。 但是,如果我现在输入ls, 有students.csv。 让我们继续和开放的students.csv。 这又是一个非常 轻巧的文件格式。 但我只是通过了一项约定 我有两行和列在这里。 第一列是 人的名字。 第二列是学生的 宿舍,或学院,或房子,或诸如此类的东西。 而现在我已经保存在此 永久在文件中。 因此,它不是那么有趣。 但是,这只是一个敲门砖,现在 要能坚持信息 久治不愈。 所以,让我们来看看现在还有什么我们可以 如何处理这些和其它特征。 但首先,什么问题吗? 这是一个很多,而且非常快。 但是,你会看到很多 更PSET 4,也是如此。 是吗? 听众:有没有一种方法来 继续添加名称到该文件? DAVID J.马兰:好问题。 有没有办法继续 将名称添加到该文件? 是。 而且,事实上,如果你最终 最多再打开文件, 你会使用报价 引文结束“一”进行追加, 这只会增加一个新的线, 新的生产线连连,完全吻合。 好问题。 其他的问题吗? 是吗? 听众:如果您运行了 再次程序现在, 它会不断增加名字的 文件或将它打开了一个新的文件? DAVID J.马兰:啊,好问题。 如果再次正确运行程序 现在,也许在输入新的名称, 将其添加到文件 或覆盖文件? 后者,因为我 不使用追加模式。 而且因为我只是一味地 打开该文件进行写入, 它只是将覆盖该文件。 所以,我的确需要做的是追加, 如果我想确实有一个长期的 数据库。 现在,CSV是有用的,坦率地说,即使 像如果你writing-- 我们最终会看到这个 后来在学期时, 我们使用的CSV用于其他目的。 如果你想存储所有的人 谁已经注册了一些事件, 或者注册了您的学生 组,或者类似的东西, 将数据存储在这种 格式是超级方便。 因为从字面上看,如果我 要下载此文件。 我可以double--和 让我们真正尝试这 如果我有Excel或数字放在这里。 我要右击 或控制单击我的档案。 哎呦。 用鼠标右键单击或控制单击我的档案。 来吧,我的鼠标是不是合作。 Download--我要去 下载的所有文件,在这里,所以 只是这样我就可以抓住这一个。 而让我们看看,如果这个工程 students.csv--第一次 我已激活。 现在,他们希望看到我的联系人。 现在,我需要注册。 看到它是多么容易使用的CSV? 是的,保持最新。 好了,现在我们已经准备好上课。 OK,哦,有什么新的? OK,关闭。 这是不可思议的。 好了,现在我们必须更新。 而现在,它忘记了什么 文件我原来开了, 但什么A--我们走吧。 好了,现在我们有一个Excel文件。 谢谢。 好了,我做的是一件容易的事。 当然,我可以预装 Excel或数字,或其他程序。 但是,这是很好的,因为 现在我可以操纵 在标准格式中的数据。 所以,现在我们的上下文 切换到我们离开 最后的时间,这是开始 起飞训练车轮。 但首先,你没有 看到这个前面的午餐 再次发生在这里的消防和 冰在剑桥,西塔在纽黑文。 注册在CS50s网站尽快 加入CS50的学生和工作人员。 因此,我们采取了辅助轮 关闭周一follows-- 串已被宣布 CS50s库一段时间。 而且这是不错的,因为它允许 我们谈论的变量作为 完整的单词和句子等。 但事实证明字符串不存在。 这仅仅是同义词,或别名, 我们已经对一些创建 其实是多一点 技术称为一个char *。 事实上,我们看到了一个例子 周一计划 这并没有表现得如我们预期。 这是文件,比较-0。 而记得比较-0,如果 我重新编译周一的节目 并运行比较-0与2型糖尿病的妈妈 小写,妈妈用小写了。 该方案坚持我 输入不同的东西, 即使妈妈,都在 小写的,是一样的视觉。 那么,什么是简单的答案 为什么电脑认为 这两个字符串是不同的? 是吗? 听众:[听不清] DAVID J.马兰:没错。 所以,妈妈,第一次 我在键入它,正在 地方保存在我的电脑 存储器但在不同的位置 比我第二次输入的妈妈。 现在,它肯定可以优化。 计算机可以是聪明, 实现这两个字符串,哎, 他们是相同的。 让我没有冗余存储。 但是,计算机不这样做 优化,除非你告诉他们。 因此,在默认情况下,他们是 只是要结束了 在内存中的两个不同的地方。 所以更清晰,当 我们比较两个字符串, 第一个被称为S, 第二个被称为 T,具体什么是我 这里比较第13行? 是啊。 听众:这是在内存中的位置 该变量将指向。 DAVID J.马兰:没错,我是 比较在存储器中的位置 这些变量指向。 因此,特别是,如果妈妈是在 字节号1,和2和3, 和4--因为记住的反斜杠 0需要是一路在末端。 和妈妈,M-O-M的另一个实例, 是在地址10,11,12,和13。 我是比较1,该地址, 在存储器中的位置, 对10,这是 明显不一样。 1不是10。 因此,这是很好的在 这是非常简单的。 但它是有问题的,只要 我们似乎无法比较字符串。 所以fundamentally-- 并且在该低的水平, 如果你想实现 方案比较 两个独立的词了 用户键入的质量, 做自己排队字符为 炭,只是条件一般, 我们需要什么做的,显然是? 这是不够的只是 看看这两个地址。 什么是我们需要做什么? 是吗? 听众:遍历 字符串[听不清]。 DAVID J.马兰:是啊,让我们 遍历字符串。 让我们用一个for循环,while循环,或 无论你是最舒服的。 如果我们有两个字符串的地方 在内存中,让我们来看看各的 第一个字符,那么每个第二 字符,则第三和第四, 第五,直到我们打 有什么特殊的标记值? 听众:[听不清] DAVID J.马兰:是啊,反斜线 零,在该点在任一字符串 我们可以决定就是这样。 我们有没有匹配的每一个人物? 如果不是,返回false。 如果是的话,返回true。 所以这正是这个版本 该方案的比较-1.C一样。 它等同于我们 看着除了星期一,我已经 摆脱了字string--的,虽然 有没有功能impact--所有 我现在做的是消除 一些视觉辅助轮, 但要清醒地看到, s和t地址。 这就是明星, 星号代表 是一个地址,或称为 更多技术上的一个指针。 所以,当我在申报小号 第9行,说的char * S, 这并不意味着给我一个字符串。 这意味着给我一个变量,其 生活目的是存储一个地址。 因为我即将把 字符串转换成它的地址。 事实上,GetString的,是 清晰,不返回一个字符串。 它不返回的妈妈 反斜杠零,本身。 什么是GetString的具体 而恰恰回来吗? 听众:[听不清] DAVID J.马兰:一个地址, 第一个字符的地址 在一些字符串就已经得到了。 所以现在我们所看到的 一个特殊的关键字了。 而且,我提到这点。 这将是好习惯 我们会一次又一次地看到了。 我检查,以确保 s是不为空,t为不为空。 因为根据我真的 快速提早些时候, 什么可能意味着,如果GetString的返回不 一个地址,但N-二U-L-L,这是再一次, 一些特殊的价值? 听众:错误。 DAVID J.马兰:这是一个错误。 出了些问题。 什么一般 可能发生的事情,尤其是 与strings--可能 未知长度advance--的 也许是电脑“ 内存不足,可能 你在这种类型的 长字或句子 或粘贴这样一个庞大的作文 那里只是没有足够的内存。 所以GetString的不能返回 整个事情的地址, 所以它只是没有返回值。 它说,一个错误已经发生 通过返回特殊的NULL值。 这是零地址,可以这么说。 现在事实证明,C提供一 函数,它的迭代。 我们没有一起实现这个 一个for循环或while循环自己。 我们可以用一个函数, 所谓的简洁, 搅拌补偿,或字符串比较,其 人生目标是做这一点。 你给它两个指针,两个地址, 它会去到这些地址 然后比较信 信信的质量, 停止,只有当什么是真的吗? 当直觉上应该挑起补偿 停止迭代,只是要清楚吗? 当它击中一个反斜杠0在任 串,在这一点上,它可以决定 拥有一切匹配,或 以前有差异? 所以,如果我们运行这个现在尝试 我们的小市值的比赛, 因此要比较-1,./compare-1和 键入小写字母妈妈两次。 现在,同样的事情。 如果我再这样做有 小写再大写的可能。 现在,它的确与众不同 之间大写和小写。 所以,不是所有的硬或 神奇,但它现在解释 这是怎么回事引擎盖下。 那么,我们还能提取 从这种教训? 因此,让我们来看看这个。 我要继续前进,写一个 快速程序这里所说的复制0。 现在让我们继续前进,实际上 让我们做this--复制 - 0, 看看我在这里得到了什么。 我首先告诉用户,说些什么。 然后,我得到一个字符串 我将其存储在s中。 然后我检查如果s等于 等于NULL,只返回1。 因此,这仅仅是标准的错误检查。 没有什么有趣的事情发生了。 而事实上,如果我们摆脱错误 检查,这看起来像本周1码 眼下。 但是我已经开始获得 稍微好有关。 现在,在第16行,一个星期前,也许 甚至几天或分钟前, 你可能会说行16 创建一个变量称为T 和复制s转换它。 这是一个完美的 合理的外卖。 但更准确了。 什么是发生在第16行? 什么是得到复制 从右到左? 是吗? 听众:为T获得第一个地址? DAVID J.马兰:没错,T 越来越s的地址。 所以,现在要清楚,如果我去 回到那个前面的例子 我抽出我已经输入了的事情。 而我所键入的 in--这里的s和这里 是我所键入的某处 内存,妈妈再一个反斜杠 0了加我。 我存放在这里,回想一下, 这是在位置1,2,3,4, 这是何等的当前秒。 因此,如果第16行,我说给我 另一个变量称为T和存储 在s的值,什么 在这里获取存储不会妈 而是仅仅数字1。 因此,如果我们向前看这个程序中 现在,有什么事情发生? 所以发现有 这个功能你可能 已经前段时间用这个凯撒, 或的Vigenere,或者根本没有。 我要求我的printf,我 要利用复制吨。 首先在第19行,快速神智 检查,T的strlen的检查长度。 因为我不希望 尽量利用的东西 如果没有串存在。 如果用户只需要敲击回车, 没有什么把握。 所以,我不想做线21。 因此,第21行正在利用 这封信,显然,在T? 听众:M? DAVID J.马兰:它看起来 喜欢它的拷贝哪一个? 听众:M。 DAVID J.马兰:嗯,男。 好了,第一个男, 因为通知说我 传递给TOUPPER,这 如果你从来没有见过它的 只是一个函数来 利用作为其输入。 Ť支架零意味着放弃 我T的零字符。 所以,如何做到这一点 画面切换,要清楚吗? 需要得到什么重写或者改变 相对于s和t和妈妈 反斜线零。 听众:[听不清] DAVID J.马兰:是啊, 所以这一块在这里简单地 需要得到改变用于:修复this-- 需要得到改为大写M。 但现在,在后来的看 程序,如果我打印出来 S和T为我打扫这里,看什么 事情发生打印出s和t。 因此,请复制0,./copy-0。 让我继续前进,键入 在妈妈的全部小写。 注意原始和 该副本已资本化。 为什么呢? 那么,S和T都指向, 如果你愿意,相同的内存块。 坦率地说,这是越来越 真正uninteresting--事实 我们使用零地址在这里。 我的意思是,我真的不关心 那里的东西是在内存中。 对不起,我抹去一点也不为过。 但我真的不关心 那里的东西都在内存中。 所以,确实是 程序员倾向于考虑 就是当你谈论 一个地址,或者一个指针, 谁在乎它是在内存中。 我不关心,如果它在 字节一或一十亿。 我只关心这个 变量是有效的 指向的内存块。 所以,从今以后,而不是狡辩 在任意的内存地址,让我们 刚开始绘制指针 作为指针,为箭头。 那么,S和T真的, 根据这一计划, 因为我是如何创建的T, 这只是两个独立的变量 指向相同的内存块。 我们不关心他们在哪里。 所以我们可以抽象掉的细节。 那么,如何解决这一问题? 如果我想编写一个版本的副本 项目实际的字符串复制 只有大写 副本,只是凭直觉, 真实得到了什么是一个 成份,我们的解决方案? 听众:[听不清] DAVID J.马兰:我们需要什么? 听众:内存块。 DAVID J.马兰:我们需要 内存另一块,对不对? 我们不知道如何 做到这一点的是,不一定。 但我有种需要做到这一点,以便 在小写原妈 在额外的内存块结束。 然后当我改变的副本,我 不想在这里改变此副本。 我不是想改变仅此 副本使原来的不变。 那么,让我们看看我们如何做到这一点。 在copy-1,它已经 被剥夺了评论, 但网上评论道。 我们不是做following--这些 线是相同的,给我一个字符串 并称之为秒。 但是,现在让我们来看看我们的最多一个 复杂的,但在过去的复杂性 一段时间,第16行正是这一点。 因此,如果与您的舒适 图片我们只是drew-- 给我一个新的内存块, 所有内容复制到它, 让我们看看如何把这种代码。 因此线16,在左手侧, 字符* T给我这个盒子在这里。 这就是它。 在右手侧, 米ALLOC,或malloc的, 是内存分配,超花哨, 只是说,一个神秘的方式 给我一个内存块。 多少内存,我们需要什么? 那么,是怎样的一个大的表现。 但是让我们看看它说在这里。 因此,这当然是给 我s的字符串长度。 因此,母亲应该是什么呢? 所以只有三个,对吗? 妈妈是三个大字。 你不要指望了 反斜杠零,当你 谈论一个字符串它的长度 其实人类可见的字母。 所以妈妈,所以这给了我3。 但是且慢,我现在加1。 为什么我真的想 分配4个字节,而不仅仅是3? 是吗? 顾客:定点价值? DAVID J.马兰:没错, 该标记值。 对于反斜杠零, 我需要总共4个字节。 所以,我需要的长度 字符串加1。 然后就是好measure-- 即使在这个系统上, 它总是将是1--我说 通过一个char的大小乘这一点。 原来的si​​zeof是 C中的运算符 只是告诉你的 字节数这 所需的一定的数据类型。 它不会对数组工作, 典型地,有时它。 但在一般情况下,没有。 但是,它会告诉我有多少字节 char是,这原来是始终为1。 所以,这就像乘以1。 因此,超级神秘的期待一行代码。 但它是所有给出 我的内存块。 但它似乎是复制 任何东西到了内存? 还没。 所以,我该怎么上线22和 23,24,25,好了,我只是做到这一点。 这是排序 老同学现在的东西。 这就好比PSET 2,其中 你只是搬东西 各地在内存中,或者说在字符串中。 所以,我从0迭代到 的串s的长度。 而我复制第i个字符 以s成吨的第i个字符。 而且因为我,程序员,做 一定要准确地分配尽可能多的字节 因为我需要,这是完美的 一对一的关系。 我复制的妈妈在 小写的新的。 然后,最后,我做这行。 等的效果只有 在这里利用这件T。 因此,大量吸纳,但 如果你只是考虑 到底发生了什么 在发动机罩下方 只是将这些 字节左右,所有的 是需要解决这个问题是 只给我们这一块内存。 现在的风险 铺天盖地,让我告诉 另外一个例子,几乎 相同的,除了这一个 一行代码。 因此,这是黑客版 这个方案的,如果你愿意。 但是,我们只是提取 它变成了什么事情。 24号线使用的是这件T 支架我得到小号支架我。 现在,我改变了这 在更神秘的星牛逼 加1等于歌星般加1。 所以发生了什么以及为什么 我们有一个明星人物? 我们已经看到的明星面前, 它被用于不同的位置。 我们之前看到的字符*,现在我看到 阿星在一开始,这就是确定。 因为事实证明我们 可以种推断只是 从这些第一 原则是怎么回事。 所以,仅仅是明确的,什么是S' 上周,它是一个字符串。 这并不足够了。 什么是S,具体一点吗? 听众:[听不清] DAVID J.马兰:这是一个指针。 它的地址 第一个字符我们输入研究。 OK,什么为t? 听众:[听不清] DAVID J.马兰:本 的第一个字节的地址 在T,该内存块重新分配。 所以,事实证明,当我们 从0迭代,一直到字符串 length--首先,我 从0开始关闭,因为 这个老同学for循环的事情。 因此,只是为了简单起见,我们 假设的代码,所述第一线 真的只是这样,对吧。 如果i为零,加零 的东西想必 是不会有效果。 那么,这是什么意思吗? 事实证明,明星 操作者在这样的背景下 是取消引用 操作者,这仅仅是 说法去一个奇特的方式 到以下地址。 因此,如果s是第一的地址 字符在这个组块的存储器, * S表示去那里。 因为我们已经开 图像以这种方式, 您可以采用 下面的心智模式。 如果这是S,和你说* S,* S 有点像槽和梯子, 如果你从童年记忆的比赛中, 就像按照箭头,去 到的地址。 * t是同样的事情。 所以从这里开始,去它的块。 我不能只是借鉴 该屏幕的方式。 * T手段去这里。 然后,for循环仅仅是 这里说动这个角色, 这里将这个人物, 搬到这里来这个角色。 但我怎么做增量? 我要撤销我刚刚删除。 这是什么一般称为 指针运算,这 意味着数学与地址。 如果在此for循环, 我不断递增我, 且s是一个地址,而t是一个 地址,如果我只是不断增加1, 这只是意味着不断前进, 转发和转发在内存中。 这就像牛津大街, 街道,政务司司长建设上。 在CS建筑物是在33牛津街。 所以,如果你是做33 牛津街加1, ,带你到34牛津 街道,35个牛津街, 那么牛津街36,不管这些 建筑居然是 - 如果它们存在。 所以,这就是我们正在做的 这里有指针运算。 所以这是一个非常神秘的方式 的表达自己。 但是,所有发生的事情 引擎盖下 只是下面的这些地址, 就像下面的地图,如果你愿意, 或以下似箭 我们已经在屏幕上绘制。 OK,很多消化。 对语法有任何问题,概念, 指针,malloc或类似物。 是啊,在这里第一次。 听众:那么,这 说* T等于TOUPPER * T, 就是要利用 所有的字母或just-- DAVID J.马兰:啊, 非常好的问题。 因此,在这条线在这里,31, 这是怎么回事充分利用 第一个字母或所有字母。 因此,让我们回答这个问题通过去 回到第一个原则。 在这里,第一个原则,我的意思是 刚去的基本定义 一个什么样的参与。 所以TOUPPER是一个功能 这一个大写字符。 就这样。 * t表示进入first-- 去T中的地址。 所以,在图像,如果这是块 内存我们使用malloc分配, 这是T,* T手段去这里。 同时,你传递 该值,小写字母m 到TOUPPER,你要回 外资并购,你在哪里把它? 你把它在同一位置。 所以那些对这种逻辑 基本的定义,这只是 大写的第一个字母 除非你用迭代我或 for循环或while循环,它不会 做任何事情比你问吧。 好问题。 是吗? 听众:你为什么使用 取消引用的方法,而不是 数组? DAVID J.马兰:啊,好问题。 为什么你会使用反引用 方法,而不是在阵列的方法? 没有特别的原因,是诚实的。 而且,事实上,对于这种 样的例子吧, 我只是争论使得 程序比较复杂, 更多的目光都呆滞, 人们退房 因为这看起来超级神秘,但是 即使它在做同样的事情。 所以,坦率地说,这是一个 不必要的视觉复杂的解决方案 到的问题。 它仍然是良好的设计, 五个五的设计, 无论是在支架 符号或指针符号。 但是 - 特别是当我们得到 在以后的过程中PSET 5 当我们执行该字典, 我已经提到了几个times--的 我们真正关心的 低级别的内存地址 我们真正理解 这是怎么回事。 不过,就目前而言,事实证明,这 的代码在这里方括号线 真的不存在。 他们就是被称为 语法糖,这 仅仅是一个古怪爽说的方式 编译器会将方括号是 该数学表达式。 所以这是一个人的约定 要能只写 这些非常人性化的支架。 但是,编译器,铛, 真的做任何时间 你写什么在网上突出 24,引擎盖下它真的 将其转换为此。 这只是作为一个人更愉快 读取和写入的代码如线路24。 但最终这些 培训轮子太脱落 当一个人的自己的舒适性变得更强。 好吧,所以记得那么这 是最大的问题的排序 我们碰上了。 而这正是引发这整个 关于指针该死的谈话, 和地址,以及复制的东西。 这是因为我们绊倒 这个愚蠢的,愚蠢的问题,即 我实现logically--与劳伦 在这里的演示和橙汁 在milk--完美 算法正确的函数 用于交换两个变量“ 值,但该死的东西 没有任何持续性,或 永久的,对我的代码。 为什么是? 简而言之,这是为什么 实施互换 逻辑上是正确的,但没有任何影响 在传递给它的变量, 像X和Y的主? 什么是问题的要点? 是吗? 听众:因为变量进行的 变量中通副本 通过功能。 DAVID J.马兰:没错,当你通过 变量成一个函数,或参数 到一个函数,它们是 通过复制,通过这 意味着你得到一个相同的期待 位x和y的模式, 这里所谓的a和b。 你可以做任何事情 你想与这些副本, 但他们将不得不无 在呼叫功能的影响。 而且,事实上,我们制定了 画面在屏幕上,召回 最后一次,如果你由此 真正思考什么 怎么回事下方的hood--如果 这是你的计算机的内存, 而这儿是块 被用于主存储器, 这是对组块 被用于交换内存, 所以即使主要有 两个变量,x和y, 掉期可能具有相同的期待 值,这两者都是1和2, 但他们完全 不同的块的存储器。 因此,我们需要一个解决这个。 坦率地说,似乎我们现在 有一个解决这个问题吧。 如果我们现在有能力 通过地址的方式处理事情 排序和,滑道和梯子 样式,请按照这些箭头 而且去任何地方,我们希望 在内存中,难道我们 解决这个问题由 从主要通过交换 不是值,我们要 交换,而只是凭直觉 什么可能我们通过交换呢? [插入VOICES] DAVID J.马兰:为什么我们不只是 通过它的地址,对吧? 我们为什么不给换一个 藏宝图,如果你愿意, 导致它的 实际值x和y。 让我们交换,真正改变 这些原始比特,而不是 刚好路过的位份。 因此,事实上,这是什么 将是该溶液中。 这里这个版本 显然不好,有缺陷的。 而现在,乍一看,它只是看起来 就像我们增加了一堆明星随机 并越过我们的手指 它将编译。 但是,它现在将汇编。 但是,让我们看看这些东西的意思。 和,遗憾的是,作者 把C选择另一个符号 使这一点 更清晰,但星运营商 有不同的含义 两个不同的上下文。 我们已经看到了两个, 但让我们分辨。 所以向上在那里的顶部, 当我已经改变a和b 被廉政局在恶劣 版本为int明星,a和b, 以前,都是整数。 什么是a和b现在在 好,绿色版? 他们的地址。 什么的,地址是明确的? 整数地址。 因此,事实上,我 他说INT星级手段 这是的地址 的整数,具体而言。 所以,现在的代码行通知, 别的东西也发生了变化。 tmp中保持不变,因为 这只是暂时的整数, 没有记忆的魔法存在。 但现在需要一个明星。 而且,事实上,每一个 其他提及的a和b, 请注意,所有的 由红色变为绿色 是,我的前缀 这些变量的星星。 因为我不想要复制a和b。 因为如果我只是复制a和b和交换 A和B,那我其实交换? 只是地址,我想交换 什么是这些地址。 我想去那边。 这样一来,星运营商 我的函数中, 不参数列表内, 意味着你去到这些地址 而真正改变这些值。 那么,是什么图片 现在的样子吧。 好吧,如果不是我传递 在A和B不1和2-- 其实,我需要添加 这里另外一个定义。 因此,假设这个块 内存是在位置10。 这是在位置11,但是这 是有点简化, 我现在有两个选择做我传递X 和Y或者我通过他们的地址? 如果我通过他们的地址 就是这样,我只是 现在需要实施 每绿色代码交换 因此,它认为当一个,当它 看到B,它不只是复制a和b 并移动牛奶和橙汁。 牛奶和橙汁 比喻现在坏了, 因为那些都是杯具 的液体,而不是地图。 我们反而需要去 解决10,我们 需要去解决11,和 然后执行交换逻辑。 所以逻辑是相同的,但 我们需要一个稍微不同的方式 对访问这些变量。 所以在最后,是什么 程序有样子是这样的。 在swap.c逐字复制 并粘贴绿色版。 但我需要做一个改变。 这是不够的只是改变掉。 什么其他代码行 我是否需要改变? 是吗? 听众:当它需要的参数。 DAVID J.马兰:在哪里 它需要它的参数。 所以,如果我向上滚动到主,我 不能仅仅通过在x和y, 而且,我答应,最后 一块新的语法今天。 我需要传递的不是X和 年,但x和y的地址。 而事实证明,符号 即C的作者选择 是,如果你在这里使用的符号,不 可与按位符号相混淆, 如果您使用的符号 这里和这里的符号, 这个数字为你, 什么是x的地址, 也许是10,有什么 Y的地址,也许是 11,并传递的那些代替。 因此,大量吸纳的一次。 但是,让我们现在快速的看到 我们剩下的4分钟 那里的东西可能会出现偏差。 而作为一个不谈,实际上 我拍下了这张照片, TF一年或两年前拍下了这张照片。 因此,这是后面的角落 艾略特食堂。 指针也许是最难 话题,我们将在CS50。 所以,如果你担心的那种 坡就像是也许是 更多的是曲棍球棒 这样,实现了 样的,我们正在接近一个高峰 术语的概念复杂性。 我提出这个 照片,因为我发誓 上帝,在1996年秋季,当我把 CS50与我的助教, 尼沙特梅塔,他在让我坐下 角落艾略特D.厅在午餐时, 或晚餐,或一些尝试 帮助我理解指针。 而这正是我在几个星期后, 它在演讲时介绍 我终于明白了三分球。 而且我希望这 点击将远远早于你。 但是,认识到这一点绝对间 在更复杂的主题 我们已经看了。 但是,这其中最强大的。 而当你得到它,这就是全部 刚准备终于走到了一起。 所以放心它不会 需要在今天所有的水槽。 因此,这里的最后一个程序 我们要去看看。 而我们将结束与 快速3分钟粘土动画的 我们的朋友,尼克Parlante进行。 这里有一个程序,即在前两名 行声明变量x和y。 这两者都是地址 整数,AKA指针。 然后我们分配足够的 内存来存储一个int 并存储地址 以x那个存储器。 所以,这是更简单 比以前的例子中 给我4个字节的内存, 这是一个int的大小, 并把该地址x中。 这条线在这里的意思 去x中的地址 并把意义 生活中,数字42那里。 不过,此行让我担心。 星y表示去的地址Y, 并把不吉利的数字13出现。 为什么是危险的,在这一点上 在story--虽然迅速告知 在我们的减弱分钟 这里 - 为什么是坏 我说,去y中的地址? 听众:你有没有[听不清]。 DAVID J.马兰:我没有 放任何东西在年。 那么,什么是y的值, 在这一点上的故事? 我们不知道。 这是一些垃圾值 并且也不宾基知道。 如果我们能够结束这一点。 [视频回放] - 嘿,宾基,醒了。 现在是时候为指针乐趣。 -那是什么? 了解指针? 哦,好极了。 - 嗯,上手的,我想我们 将需要一对夫妇指针。 -行。 此代码分配两个指针 它可以指向整数。 - 确定,以及我见 两个指针,但他们 似乎并没有指向任何东西。 -这是正确的。 最初,指针 不指向任何东西。 他们指出,事情 被称为指针对象并设置为 是一个独立的步骤。 哦,对,对。 我知道。 所述指针对象是分开的。 那么,你如何分配一个指针对象? - 确定,以及这段代码中分配 一个新的整数指针对象, 而这部分设置x为指向它。 - 嘿,这看起来更好。 所以让它做一些事情。 - 确定,我会取消引用指针x可 数字42存入及其指针。 对于这一招,我需要我的 提领魔杖。 提领的 - 你的魔杖? 呃,那个,这是伟大的。 - 这是什么样的代码如下所示。 我会刚刚成立的数量还有 - [POP音] - 嘿,看那里去。 所以,做一个解引用在X如下 箭头访问及其指针。 在这种情况下,为了存储42在那里。 嘿,尝试用它来存储号码 13通过另一个指针,Y。 -行。 我只是去在这里为y, 并获得了13号的设置。 再取的魔杖 提领和just-- [蜂鸣声] 哦,嘿嘿,没有工作。 再说了,呃,宾基,我不 想提领 y是一个好主意,因为设置 向上指针对象是一个独立的步骤。 而且我不认为我们曾经做到了。 -Hmm,好点。 是啊,我们分配的指针,Y,但 我们从来没有将其设置为指向一个指针对象。 -Hmm,非常细心。 - 嘿,你在寻找好的有,宾基。 你能解决这个问题,从而y点 到相同的指针对象为x。 -sure,我用我的魔杖 的指针赋值。 -is这将是一个 问题,像以前一样? 不,这不碰指针对象。 它只是变化为一指针 向指向同一件事 - [爆裂声] --as另一回事。 -原来如此。 现在Ÿ指向同一个地方为x。 因此,等待,现在y的固定。 它有一个指针对象。 所以,你可以尝试的魔杖 再次提领送13以上。 哦,好了,在这里不用。 - 嘿,看那个。 现在提领Y上的作品。 而由于指针共享 一个指针对象,他们都看到了13。 - 是的,共享的,呃,等等。 所以,我们要现在进行切换的地方? 哦,看我们没时间了。 -But-- - 仅仅记住三个指针规则。 号1,基本结构 是你有一个指针, 它指向了一个指针对象。 但指针和 指针对象是分开的。 与常见的错误 是建立一个指针 但忘了给它一个指针对象。 2号,指针废弃 开始于指针 并遵循其箭头以上 访问及其指针。 大家都知道,这只是如果有工作 为指针对象,哪一种回来 排除1号。 3号,指针 任务需要一个指针 并将其更改为指向 相同的指针对象为另一个指针。 因此,在转让之后, 两个指针 将指向相同的指针对象, 有时这就是所谓的共享。 而这一切就是这么简单,真的。 再见了。 [结束播放] DAVID J.马兰:这就是它的CS50。 由于尼克Parlante教授。 我们会看到你下周。 [电子音乐播放]