[主题曲] 扬声器1:嗨,大家好。 欢迎回到一节。 美好的一天out--这是为什么,我 当然,也有只有你们四个在这里 而不是我们平常包。 我一直在生病这个周末。 所以,我没有对星爆你们。 我可能会开始咳嗽 可怕的整个。 因此,只要多多包涵。 我要真正尝试 并通过这个获得第一, 虽然,之前我有咳嗽发作。 但是,仅仅是简单的对我 小bit--这就是我问。 因此,我们对today--议程只是一个 下周reminder--你测验是。 我告诉你,这最后一周,因此 会不会抓住你措手不及。 所以我再次提醒你。 下周的测验。 为此,下周的 节会更 of--我会试着在一些审核工作。 所以,如果你们能 帮我出了送我 的东西,你是舒服 有,那你担心, 你想的主题 我来遮盖,那简直太好了。 所以,我可以尝试和他们的工作 到下周我们的部分 或向您发送额外的材料或准备 你可能不会得到其他地方。 是啊! 越来越多的人来了! 我想,我做的不好最后 本周,没有人愿意回来吗? 我很害怕。 所以其他的三件事 我们打​​算走了过来 是重定向,文件I / O,以及 然后指针和动态内存。 我敢肯定你们都超兴奋 pointers--大家最喜欢的话题, 所以简单的理解。 我敢肯定你们都明白了吧? 所以首先第一件事情,redirection-- 这基本上只是一个方式 控制如何输入 事到你的程序, 你是如何从你的程序输出的东西。 主要的方式,你们 已经与它交互 仅仅是通过标准输出 在这里您打印屏幕。 但有办法 pipe--我们在这里看到 我们words--独一无二的 管道的信息 或者该数据转换成从一个文件中的一个文件。 这只是不同的方式 收拾东西到你的程序 而你的程序,而不是 只是打印他们这个屏幕 或输入的东西 在命令行中。 所以,第一个是小 比插入符更大。 所以output--它只是打印输出 到文件,而不是你的屏幕。 所以,如果你有一些印刷 “你好,世界!”到屏幕上, 如果你把它改为 到output.text,那 创建此文件名为output.text。 当你打开它时,它会 说“你好,世界!”在那里。 这可能是超好用 如果你有一吨的错误 实际上,正如我们看到的这一个。 如果你做两插入符号,它会 打印的错误信息。 所以,如果你有一个问题 编译,它有很多的错误 而你要在努力陷入困境 在命令行滚动 通过所有这些,你可以 只是它们打印到文件, 打开该文件,这样您 可以通过他们比较容易滚动。 其实我用了一个 很多时候我在调试 我的181 pset中的机器学习。 所以可以超好用以后。 它也是有用的,如果你有一个程序 这也许是生成一个图书馆 或产生一些集 字符串,你 需要能够看到 它的正确生成它们。 这是做到这一点的方法。 所以,如果你把它们打印到文件,你 可以更容易地检查它们,对吗? 与试图滚动 通过你的命令行。 再有一点要注意 是,只用更大 比插入符号,如果你正在写 到已exists--一个文件 这样一样,如果我们跑这第一 一次,我们把它output.text, 然后我们有了第二个节目 该印刷这是方案二 并做了比output.text更大, 它将覆盖that--这样 覆盖了什么是有史以来在 该文件开始。 所以,如果你想追加 到一个文件,我们在这里看到, 你只要做的比迹象2大。 而且将追加到它。 它不会覆盖它。 所以,如果你需要运行多个 计划和种不断 跟踪什么所有的人都 返回到您的文件, 这是一个办法做到这一点。 如果你不在乎什么在你的文件 并且它允许被覆盖, 你可以使用比单一更大。 这是否有意义大家? 听众:像点斜线你好更大 比输出点的文字,像两次, 它会仅仅只显示输出 点文本第二时间 - 扬声器1:没错。 所以它基本上是完全 覆盖是什么在那里开始。 如果在这里,在此文件 output.text已 存在,基本上无论你怎么称呼 这再次用一个较大 比你可以把它 因为喜欢它替换的文件。 当你保存一个Word喜欢 文档和你另存为, 与你保持相同的名称, 它完全覆盖它 - 这是同样的事情。 任何人有任何问题, 只是输出到一个文件? 真棒。 所以,很显然,如果你扭转, 箭头方向,它可以做输入。 所以,当你们有 像恺撒和的Visioneer 你必须输入一些东西, 你有一个命令行参数 实际上它的输入。 这是另一种方式来做到这一点。 因此,而不是等待 对于命令行提示, 就像当你问你的 在恺撒或消息的Visioneer, 如果你有一个文本文件 那有你的消息, 你可以只需键入它变成。 因此,如果这是像点斜线撒 3小于箭头输入文本,这 是你的讯息,也 会运行得很好。 当你的凯撒程序实际上 要求来自用户的输入, 那就已经拥有了它,因为 你输入的这个文件。 这只是另一种方式。 的output--只是一个反向 只需输入您的数据。 然后,最后一个是管。 所以这一块的很酷。 因为它可以让你 取一个的输出 程序,并把它作为 输入到其他程序。 我不知道你们中的任何 玩解密 这CS50可能 给你的,但它会 让你花一些样品 文件,将其输入到加密, 然后从那里输入 那到你解密 以确保它竟然是一样的。 因此,它是一种像三路循环。 去了。 听众:如果一个程序 具有多个输入, 有没有办法来告诉它哪个输入 使用文本文件或输出? 扬声器1:它有多个输入。 无论你的文件input--时,它的 要求输入的第一次,这是 要承担,我认为,这是 将管在整个文件中。 所以,如果你有多个输入,你 将要通过管道中的多个文件。 所以,如果你问的消息 在你的代码三次, 你将要放 在三个不同的文件。 它得到疯狂。 你不应该 担心现在。 但是,这是这个想法。 所以呀,管是一种只输出 程序使用输入到其它。 每个人都很好吗? 凉爽。 行。 你可能不会有 做太多吧。 但是,你应该明白 方法可以用这个。 并且在某些情况该 你可能想使用它。 所以,文件I / O--我知道你在做什么 saying--我们已经习惯了从阅读 并写入我们的屏幕出现, 这是标准和标准输出。 而这正是你们一直 因为上课开始在这里做什么。 但你也可以读取和写入文件, 这是所有的I / O--所以文件输入文件, 输出是所有代表。 因此,这基本上意味着, 您现在可以存储你的数据。 当你只需将它打印到 屏幕上,它基本上消失了,对不对? 只要你做的“Hello 世界“并运行的”Hello world“ 它打印的“Hello world”到屏幕上。 但你不能真正做到 任何与它从那里。 如果您在文本存储 文件中,然后突然 你有你允许该数据 操纵或把它放到一个文件中, 或者把它变成一个程序后​​。 其中的一个原因 为什么我们这样做仅仅是 作为一种方法来存储数据以供以后使用。 我有几个步骤,在这里 通过标准只是走 I / O。在第一步中,您 需要建立一个参考 与所有文件 帽FILE明星的文件。 以便创建一个指针到一个文件中。 所以,你要打开它。 和你说,从字面上看, 只是文件的fopen相等。 并且这将返回一个 指针到刚才打开的文件。 我看到了一对夫妇的你 球员在办公时间。 不过的事情之一 是remember--指针 可以是一些地址或者为null,对不对? 如果我们曾经有一个情况 东西可以返回null, 我们有什么做的 之前,我们曾经使用它呢? 我们需要检查 这是空或不是,对不对? 因为有些人可能有过 的问题,即任何物体 在突围中被返回为空。 您试图执行 它的一些功能。 与您的电脑网站出现故障。 对不对? 我敢打赌,一对夫妇的你 可能有这个问题。 所以用的fopen,FOPEN要么 返回一个指向该文件, 或者,如果出了问题, 它会返回null。 所以,你总是需要检查 它没有返回null 之前尝试做别的。 这就像一个标准的范例 那你要在这里需要。 如果有过一个机会, 事情就可以返回null, 检查以确保它 不,然后再继续。 否则,你会 让可爱的​​现场故障。 没有人喜欢处理那些。 所以,我们在这里看到,第一个参数 仅仅是文件路径。 如果该文件不存在,则 它会创建一个文件。 它只是将是空白的。 然后第二个参数 是您想要的模式。 我们想从这个文件读取? 你想要把它写? 你想追加? 所以实际上我刚才说 - 如果该文件不存在 而你试图读 它,它会抛出一个错误。 如果文件名称 - 如果喜欢 file.text还不存在 你想写 它,它会创建 所谓file.text你一个空白文件。 如果你想追加, 你应该做同样的事情。 这是否有道理? 如果你想从阅读 那还不存在的文件时, 它会抛出一个错误。 否则,它会创建文件 为你做什么,你想要它。 凉爽。 现在我们可以从文件中读取。 而这仅仅是种会 通过不同的功能 我们对文件I / O操作。这将 有必要在本周的pset中, 如果我没记错的话。 是的,这绝对将是 有必要在本周的PSET。 所以龟etc返回下一个字符。 FGETS只返回一行文本。 它会返回任何东西来 一个新的行,这将打破。 所以,用fread读取某一 字节并将其名额数 成的阵列,其 是你可能会 想要做重新size-- 可能是有用的。 有多少人看过 pset的规范,对了? 行。 [听不清] 扬声器1:OK。 行。 绝对看that--这是一个有趣的pset。 你去恢复已删除的记忆 card--时,它的作品真的令人兴奋。 但可以肯定,开始读了。 再来说说我,如果你 有关于它的问题。 好了,因为我说的,FREAD 读出一定数目的字节。 这是一些任意数量 那你要设置的。 然后FSEEK只是移动 到了一定的位置。 因此,也许你不在乎 关于接下来的10个字节。 你只是想跳过前面。 你不关心这些。 你想读的起始字节11。 fseek的可以让你做到这一点。 所以,它可以让你有所选择 你在看什么书。 因为龟etc,与fgets,并用fread读 从该文件中的某个地方。 一种方法去思考,这是如果这 是我们的文件,当你第一次打开它, 你在文件中这个位置 这开始于开始。 每当你打电话 龟etc,fgetf,或用fread, 它会从开始 这个位置标记。 比方说,你只是想读 这一段记忆在这里。 你不能只是打电话。 你必须寻求看过来 然后从那里读 或阅读,获取,或getc的, 这取决于你想要什么。 因此,寻求公正,您可以 跳过存储器的部分。 而这是唯一的 这样,你可以跳过的东西 没有阅读到您的缓冲区。 这是否有意义大家? 很显然,有一个 很多并行这里 - 的 我们的输出或输入重定向, 您已经阅读并书写。 所以的fputc只是写了一个 字符到该文件中。 fputs将写入一条线。 fprintf中打印一个格式化的输出。 所以,如果你有标签, 或空间,或诸如此类的东西。 然后fwrite的写一些 字节数组到一个文件中。 因此,这是同样的方式 FWRITE和FREAD类似于 opposites--与fgets,fputs函数和 随后的fputc和fgetc--地段 疯狂的,快速的东西。 刚种保持这个handy-- 您将有不同的时间 在那里,也许你只是想 一个字符的时间。 也许你想一整行。 随着你的字典pset-- 这是在2 pset时, 我相信,我们给你一个整体 字典中的文本格式 其中有每一个字 由一个行分隔。 所以,如果你想读 在一次一个字, 也许你用什么,如果你正在阅读 而且他们都分开上新的生产线, 只是想和你在一个时间一个字? 听众:FGETS 扬声器1:没错。 Fgets--因为返回 无论是在一行上。 如果每一个字是它的 自己的路线,我们可以使用与fgets。 凉爽。 这是否有意义,大家? 酷? 是啊,我们要得到 最有趣的部分与指针 很快,在那里你 可以做一些数学。 而这将是巨大的。 最后step--关闭您的文件。 在这里这么多的事情, 我们的范式之一 是,如果它可以返回 空,检查空。 如果你打开​​的东西, 你最好将其关闭。 OK,这样你就不会做了,直到你 这样做,除非你已经关闭了它。 有点像这还没有结束 直到胖女人唱歌。 这就像关闭文件。 因为它说,在这里,只 再次重申,永远 打开您的文件你之前 读取或写入数据。 并始终将其关闭,如果你已经打开了它。 行? 凉爽。 因此,这里是一个例子。 所以tiny--我不知道,如果你 你们可以看到,非常好。 如果我们能提高 亮度莫名其妙。 让我真正做到这一点,如果我能。 OK,你们真的不能 看得出来,所有的,可以吗? 好了,我们要做到这一点,那么。 [听不清] 我认为这是更好的看到。 任何人都可以看到我的 鼠标去是个问题? 啊,还有这is--什么奋斗! 行。 基本上,你们应该有一种 什么这一个想法在做什么。 它并不完美。 但我宁愿解释它不是花 更多的时间来正确地格式化。 基本上,你在这里看到, 我们首先打开文件。 和我们有一些 我们是数据库文件 打开该说这是我们的学生。 我们要去写它。 所以,当然,返回null。 因此,我们要检查空。 然后,如果它不是 空,我们去。 正如你看到的,我们 循环经过这里。 还有的学生。 学生是被定义为三个散。 我们正在做的事情是我们 打印到文件,对不对? 那么,我们打印出我们的文件? 听众:得分 这是在阵列中? 扬声器1:是啊。 这是在分数 在array--正好。 因此,我们要打开这个 数据库文件,该文件 我以为是某种 的成绩数据库。 而我们只是打印出 分数每一个学生到该文件。 酷? 不错。 真棒。 行。 让我们回到to-- 观众:我有一个快速的问题。 是的printf不是在for循环? 这只是在if循环? 扬声器1:不,这是在for循环。 我看不到我的鼠标非常好了这里。 所以我在努力 格式正确。 这架应消失。 它应该是到这里。 这是在你的for循环。 那里。 现在它的漂亮。 所以这是它应该如何be--除外 对于我被解雇,去年支架。 行。 这是否有意义大家? 行。 我们将继续前进 在接下来的事情then-- 其中,实际上,你会 到需要看到的代码。 所以我只是要 复制了现在。 行。 所以我要告诉你这家伙的代码。 我希望你能尝试和数字 什么是应该做的。 所以,有了that--花一分钟左右。 试图弄清楚是怎么回事。 任何想法? 我们知道,我们至少有两个 在命令行参数,对不对? 我想其中一个将是 那[听不清]我们的节目是 然后别的东西。 因为如果[听不清]为少 超过两个,我们大声呵责。 对不对? 而从使用,它看起来像 这将是某种形式的文件。 我们都同意这一点? 所以,现在,什么是循环在做什么? 它是什么经历? 听众:所有的文件。 扬声器1:没错。 它会遍历所有的 我们已经投入存在的文件。 因此,对于每一个文件,它的 开放一些字符串出现。 它开辟了该文件。 对不对? 和它的从中读取。 当然,检查它是否为null。 然后它的打印。 如果它是空的,它只是告诉我们 这是不是一个真实存在的文件。 因为记得,有 请阅读我们的文件必须存在。 对不对? 随着写入和追加, 你可以摆脱它。 但是,随着读,我们的文件必须存在。 然后,如果它确实存在, 什么是我们在这里做什么? 就让我们从这里开始。 这是什么do--这第一个字符。 它有什么作用? 他得到一个字符,对不对? 那么,什么是该做的? 它获得的第一个字符。 任何人都知道EOF? 听众:文件结尾? SPEAKER 1:file--正好结束。 所以,它要经过 整个文件,对不对? 然后它会被更新 让每一个后续字符。 对不对? 而且它是什么做的? 听众:把那个in-- 扬声器1:打印的putChar 您的屏幕保护程序。 [听不清]字符。 然后,当[听不清] 这将关闭该文件。 听众:你并不需要一个[?别的吗? ?] 扬声器1:不一定。 我的意思是,种它暗示这一点。 因为这将返回,不过,只要 因为这不赶上这一点,你的罚款。 我的意思是它可能很好 练习做一个人。 但是,一个否则并不总是 需要特别 如果你有什么事情 就像一个回报,这 意味着,在这种情况下,如果它捕获 它,你的程序将要结束 它永远也没有机会了。 这多为你从哪来的情况下 不一定回来的东西。 因为,如果这是不 返回任何东西, 这意味着,如果这是真的, 这样做的其余部分将继续运行。 在此情况下,你 希望假。 如果它回来, 你的程序的结束, 还有一种是没有必要全部 的时间,这取决于上下文。 雅各,你有问题吗? 听众:是的。 所以,做龟etc得到下一个字符? 怎样的性格会增加吗? 扬声器1:是啊。 所以龟etc得到下一个字符。 你可以认为它像C ++中的感觉。 听众:那么什么是EOF? 扬声器1:EOF是文件结束。 这只是一个标记,让你知道 那你在你的文件的末尾。 所以,这是怎么回事打印 以你的标准了。 然后它会关闭 当它这样做的文件。 然后让我们去 下一个文件,对不对? 所以,总体来说,这是什么节目呢? [听不清] 扬声器1:是啊。 它只是打印出那​​里的一切。 所以,如果你们曾经使用CAT 一些file--中,然后将名 我不知道如果你们有 做过你的终端上。 但是,如果你曾经使用 命令CAT-- C-A-T-- 然后任何文件 你那里 - 它 打印出来给你的终端,这 可超方便的一些事情。 我用了很多。 这是否有意义大家? 酷? 行,所以你的任务now--无论是 自己或身边你 - 人 是只写一个简单的程序 这将只写“你好,世界!” 出到文件。 [听不清] [听不清] 扬声器1:我当时想,做 我说不好,上周做​​什么? 我不认为这是不好的。 我很高兴你在这里。 这真的让我很高兴。 我的简单的快乐女孩。 我只是想,当我的部分参加。 所以我刚刚得到这个开始为 你们让我们可以编写在一起。 我不喜欢把任何人 现货,除非你想要的。 顾客:测验,做 我们要编写一个程序? 扬声器1:您可能会被要求 手工编写简单的程序。 是啊。 听众:测验是下周,对不对? 扬声器1:本测验是下周三。 这意味着有一个可爱的[? CSE?] 党的分级之后,这 意味着你将得到你的分数 回来的night--在什么时候? 谁知道? 但是,这将是夜晚。 行。 我们想得到怎样的开始呢? 我给你一个hint--开始与此有关。 听众:你要打开一个文件。 扬声器1:是啊。 那么你想打电话吗? 你只想把它称为“文件”? 我们可以很容易。 所以fopen--什么是我们的 输出测试将是? 称之为“你好。” 什么是我们的模式? 什么是我们做的这个文件? 听众:阅读。 写作。 扬声器1:我们正在写它。 可爱的。 好了,我们现在有这个文件。 什么是我们需要做什么? 听众:检查是否为null。 扬声器1:检查是否是null--完全吻合。 这就是我喜欢听。 这应该是自动的,尤其是 几乎从这点上。 如果你开始段错误,您可能 没有检查空的地方。 十有八九的,这是 将是你的错误。 所以,如果你能得到的 习惯,经常检查它是否为null, 你的生活将是 不错,easy--或更容易。 因此,检查,看它是否为null。 所以,如果它不为空,这 是什么砰等于 是指:不null--它是有效的。 我们究竟想干什么? 我们只是想打印 该文件,对不对? 那么,我们要使用? 听众:fprintf中 扬声器1:Fprintf--可爱。 和fprintf需要两个arguments--在哪里 这是怎么回事,我们要打印的是什么。 那么,什么是第一位? 在哪里了? 听众:文件。 扬声器1:这将文件。 ?我们要打印的? “你好,世界!” 行。 我们还有最后一个件事 - 这里的另一大模式。 听众:关闭。 扬声器1:关闭。 你去那里。 听众:这是发生 如果文件是空? 扬声器1:不,这是如果它不为null。 听众:哦,如果它是不是 - 确定。 为则fopen然后 这里面去两个参数, 什么是第一个参数又是什么意思? 扬声器1:参数是 就像该文件的名称 你想去。 所以这个运行后,你会 有一个名为“你好”的一些文件 说了“你好,世界”在其中。 就这样。 只是名称。 听众:由于它的写作中, 文件不必存在。 这就是你说了什么? 扬声器1:没错。 没错。 如果“你好”作为文件 还不存在,它的 要创建一个名为 你好“,写它给你。 听众:当你告诉 程序写的文件, 为什么你写的“文件”,而不是 文件和fprintf--的名称 扬声器1:由于在这种情况下,我们有 大型FILE--所有caps--明星, 文件中。 所以它是一个指向文件 你在说什么。 这是的方式 我们只是参考一下吧。 所以在这种情况下,你 能想到file--啊哈的, 我们可以在这里使用this--文件 指的开口“你好” 并让其写。 听众:我们可以把“你好” 代替[?只是?F的文件? 扬声器1:没有,因为“你好” 必须是开放的,可写的。 文件在这里就像是一个 标志,说好了,我们 有这样的file-- hello-- 我们正在寻找。 它已被打开。 而我们将要写入。 如果你只是用“你好”, 被封装在其中。 因此,它会发疯。 我的意思是,你可以把它命名。 你可以做的文件, 明星,“你好”,等于说。 但是整个的一点是,你 需要一个文件指针明星为了 能够使用这些功能。 听众:你能做到 文件,明星,文件,“你好” 或者你必须把 通过它的文件巨星,文件? 扬声器1:你可以 做好档案,明星,“你好。” 你可以改变这 无论你想要的名称。 这是完全任意的 什么名字是。 你可以使用任何名字。 将它命名为飞意大利面条,如果你想要的。 听众:什么是“W”的报价? 扬声器1:在“W”只是模式。 因此,我们写这个文件。 大家好? 清楚了吗? 是的。 听众:所以当它写这 文件中,我们在哪里,然后找到那个文件? 扬声器1:这将是在同 你是在当前目录中。 如果你在PSET三年 你运行这个,你PSET内 3文件夹将是 该文件名为“你好。” 酷? 大家好? 我觉得你的所有 得到它,这是伟大的。 行。 所以,回到我的幻灯片展示 - 我喜欢的事情工作。 OK,pointers--是你们兴奋吗? 指针是巨大的。 他们需要一点点 来包装你的头左右。 这是我第二年 教学指针。 我想我终于得到它。 所以,如果你挣扎,它的确定。 正如我之前说的,画画 帮助了很多的事情在CS, 就像我认为人们倾向于 想想哦,我们是在一台电脑。 我们应该代码。 No--绘制图片 将真正帮助你。 我真的鼓励你 打入你的幼儿​​园老师边 并带出蜡笔 或者标记和抽奖。 因为它会帮助你。 如果你看到我在办公时间内,我 将随身携带纸堆 用钢笔画的东西出来。 因此,特别是 pointers--画画。 我敢肯定,我们究竟要 要绘制一些照片也在这里。 所以你们都找来看看宾基, 这个很酷的claymation的事情。 我们认为这是非常有趣的,当 他爆炸成一堆碎片。 这是一些可笑的安心上课。 C [听不清]这个伟大的能力 以能够控制存储器。 而且它的事情之一是真的 使得它如此强大的语言。 但随着巨大的动力来自 责任重大。 和疯狂的事情都可能发生 如果你不小心。 所以,当你使用 指针,你想 确保你真正了解 正是你在做什么。 的希望下一点点 时间会帮助你真正了解 指针,如何使用它们, 以及如何操作它们。 所以memory--我敢肯定,我们已经 以前见过这个图。 因此,这是只是一个简单的示意图 事情怎么可能存储内存。 所以,你基本上有这些 中的一个字节的块巨大阵列 就是我们这里 - 轻微 递增1,每次。 这是十六进制[听不清] 这样8位的块。 而每块关联 一些十六进制地址。 所以,如果你看到的 0X,这只是notating 这是一个十六进制地址。 你可以假设,这意味着 一些地址在存储器中。 我们谈论的是内存地址 每当你看到十六进制。 我们是整数变量, 彩车是存储变量。 所以,整数存储整数。 花车彩车店。 所以,我们也有三分 那家商店的内存地址。 这是一种映射。 指针是完全 为存储器地址。 所以,这就像你的类型有。 您的设备是32位,这意味着 您的内存地址是4个字节。 让你有任何的指针 也将是4个字节。 否则,如果它是四个字节, 存储器是4个字节。 指针存储内存。 因此,它们是四个字节。 Cool--只是想加强这一点。 现在你应该得到这个漫画。 我不知道你们有多少人 XKCD是球迷,但我喜欢XKCD。 这很棒。 行。 所以创建pointers--正如我所说,这是 非常简单,只是想别的。 你有一个类型。 你有一个名字。 对不对? 这就是我们必须在那里。 [?十六进制?]星意味着它是一个指针, 然后随便你怎么称呼它。 因此,类型代表 你可以存储。 行? 以同样的方式,如果我们做整数, 我们知道,我们要存储一个int那里。 用一个指针,它 保存的存储器地址。 但是,它的意思是that--这里的地方 图纸是要派上用场了。 所以在这种情况下,我们有 一些value--假设4。 四是在地址之一。 行? 在这里第一个指 这是一个指针2倍。 对不对? 这是一些指针X。 x可以是什么,等等。 无论X is--说x是4。 这是怎么回事存储 此处的存储器地址。 因此INT,明星,x--这是 在memory--其他插槽 谁知道这是什么。 但它要在这里存放的地址。 因此,这将是like-- 在这种情况下,无论什么, 被存储在0x1--任何存储 在我们的指针保存地址, 有与匹配 我们所指定的。 所以在0x1,则在这种情况下,此为x。 这永远只能是一个 我们使用这个,而诠释。 同样,如果我们有 另外1Y,不管 地址存储用y具有 是一个char--同样的事情态。 以同样的方式,只要你 尝试做的INTx等于0.4, 它会骂你,是 好像没有,你说你想要一个int。 这应该是一个int。 停止努力,使之成为浮动。 因此,让事情是他们想要的。 让事情自己做主。 这么大的事情就是 指针的任何类型 这是,这是唯一的 你可以存储在那里的​​事情。 行? 通过练习,与 上周,应有尽有 看来真的是种抽象的。 我们要做一些练习。 它应该更有意义。 因此,参考和dereferencing--它的 真正重要的是让这些直线。 我还是要刷新 飘飞。 我很喜欢等待,我想要哪一个? 因此,符号,实际上给 您的参考或地址。 所以它返回到地址 该变量的存储器存储。 所以它要真正恢复到您 十六进制,而它提领 实际上是要给你 被存储在那里的​​数据。 行? 所以,我们要来看一个例子 真快,居然还是旁边。 行。 因此,我们必须想想真 小心这一点。 所以在这里我们有一些整数x。 我要去尝试,并得出这样的 出尽我的能力。 因此,我们将这个插槽x。 它的存储5。 它的地址是为0x4。 酷? 都不错。 所以,现在我们有这个指针。 正是在这里。 和符号给我们 某事的地址。 所以,在这种情况下,它是x的地址。 什么是x的地址? 04 - 而这个指针是0x08的。 酷? 所以,你可以考虑一下这个 指针04,只是点在这里。 而他们所谓的指针 因为当我们得到更多成这样, 你会看到指向的东西。 和一个块指向另一个 块将使得很多更有意义。 因此,这里有两个。 然后我们有一些 副本,这是what-- 0x0C的。 而这将 我们取消引用指针。 那么,它的意思是 好了,这里是我们的指针。 它存储的值是0×04,什么 它说是去这个地址 并告诉我,什么是它。 所以这是有效的 这是什么方向做。 你可以认为这就像你的明星。 这样就OK了,当我们这样做的明星,这意味着随之而来。 去这个地址。 而这基本上就是以下 这个箭头,这个内存块。 给我们什么呢,这是5。 这就是为什么我们的副本等于5。 这是否有道理? 有没有人需要我去通过 那一次,或者更慢? 你要我去 通过这一次? 行。 我们要再次重绘。 当我们开始,我们大家都同意,我们有 一些内存块,这是一个变量 X,我们设定为等于5。 我们不控制它在内存中。 所以,这个地方就是 任意分配。 好的呢? 行。 然后我们初始化一个指向整数的指针。 这就是为什么它可以指向 X,因为我们在这里为int。 我们的另一块 内存,因为这个指针 就像其他任何一个变量。 它任意分配 在内存部分空间。 和它存储为x的地址。 与符号表示x的地址。 那么,什么是x的地址? 听众:这是zero-- 扬声器1:0×04。 所以then--最后一个。 我们再次有一些copy-- 只是另一个变量。 因此,让我们分配一些任意的地方。 我们解引用我们的指针。 明星意味着进入 地址保存在我的指针。 告诉我那里的东西。 因此,存储地址 在我们的指针为0×04。 所以,我们去那个地址。 它指向该地址。 这是什么内存块中? 这是一个五人。 所以,这就是我们给我们的副本。 大家好? 凉爽。 Again--图片。 因此,跟踪这里 - 我的价值观 打算让你们想一想。 我们可以得出另一张照片。 但我希望你能尝试的理由 通过这个你自己一分钟。 由于他们没有给 我们作出了榜样地址, 我只是做符号x-- 这将有助于推动它带回家。 &符号表示的地址。 所以在第一位的,每个人都 去的第一道防线。 一些X设置的一些five-- 随机时隙中的存储器。 INT明星指针等于 x的地址,对吧? INT明星指针创建 这个块,称之为指针, 并将其分配给x的地址。 我可怕的&符号。 现在我们正在做的就是我们说 OK,我们解引用指针。 所以,我们去好了,什么是我们的指针? 它的符号X。 去符号x和重新分配它。 所以,现在,符号X将是35。 所以基本上,当你 提领,你去确定。 你将要绘制 图片是这样的。 你将要绘制 你的箭在哪里。 所以,到这个插槽的内存,要么 给我回值,或改变它。 在这种情况下,因为我们在这 值,我们分配它是35。 而在最后 1,如果你注意到,我们 被指派了什么 在这里别的东西。 因此,他们有这个真棒表。 这不是那么糟糕。 你们的工作就可以了。 我要拔出来在黑板上。 我们要填好在一起,好不好? 因此,抓住一些纸,抢 一个合作伙伴,开始工作。 我要得到一个 更大的粉笔。 因为这将是很多。 行。 教授:OK。 让我们先从第一排。 我们会从那里开始,那么你们 也许可以工作,通过多一些。 行。 一个等于B C时代那么什么是? 这不是一个有趣的问题,我保证。 学生:4次5。 教授:4次5。 20。 那么,什么是B? 学生:4。 教授:与c? 学生:5。 教授:5。 然后这只是要 将一个&符号,符号B, 符号C,对不对? 不错。 这是很简单的。 行。 因此,下一个。 A等于一时间C,以防 人是不熟悉的。 是大家熟悉的 随着时代等于? OK,这一切是指:这是 简写为等于C时代。 您还可以划分做到这一点, 用加法,用减法。 你可以做一个等号,或加等于C 是指等于加C,负同等 C将作为一个等于负温度。 这只是语法糖。 所以,在这种情况下,a是等于 一个C时代将会给我们带来什么? 同样,没有一个有趣的问题。 学生:100。 教授:100。 难道别的什么改变? 号 也许我将最终得到 我的&符号更好。 学生:OK,对不起,你是怎么得到100? 教授:OK。 这样一等于一 次C,所以C时代。 学生:哦,你用 一个用于previous-- 教授:是的。 因此,这些都是我们的最新值。 这些都是你应该 用在我们向下移动,OK。 所以,B是唯一改变,是吧? 因此,让我们填写一切。 B.什么是B将会是? 生存还是毁灭。 那么,什么是该做的? 什么是明星PA在做什么? 学生:代号为PA的位置。 学生:不,不完全是。 所以这是一个d参考。 学生:所以B是PA的手的价值。 教授:是的,所以PA是 的地址,对吧? 因此,它说走到哪里是一个 存储,并给它的价值。 那么,什么是B? 学生:100。 教授:100。 完美的。 好了,电脑是什么样的变化。 其他一切保持不变。 什么是电脑将会是? 简单的赋值。 PC等于PA,什么是PA? 学生:一个&符号。 教授:完美。 现在,我们越来越有趣。 OK,让我们打破这一个了。 首先,什么是B C时代,因为这是 这一个简单的部分,对不对? B C时代is-- 学生:500。 教授:是的,所以 什么是这个做的, 如果它的明星PB,有什么变化? 学生:是什么在the-- 教授:是什么在B? 学生:什么是在空间 即PB指向。 教授:和PB指向to-- 学生:B. 教授:B.因此,唯一的 事情变化是B,正确。 所以B次C,500。 所以这就是现在什么样的变化。 凉爽。 可爱的。 你们正在做的很好。 好吧,打破这一个了。 C的变化,对不对? 因此,我们可以填补一切。 让我们来看看。 行。 我们知道,C是将成为 产品两个数字的,对不对? 哪两个数字有关系吗? 学生:A和C? 教授:那么一个是 右边的第一个。 因此,我们ð引用的p,对不对? P的指向,所以我们知道, 这将是100倍是什么? 什么时候做PC点? 指向。 所以,100次100万。 这是否有道理? 凉爽。 家庭舒展,伙计们,最后一排。 行。 有什么变化吗? 学生:A. 教授:A.完美的,所以 一切可以保持不变。 行。 什么是? 所以这是一个什么时代? 这是星PB。 因此,星PB意味着这里的 PB,PB点到b。 学生:500。 教授:500。 因此,我们有500次100。 这是50000。 呼! 你看那个。 学生:为什么我们 的&C的last-- 教授:对不起。 学生:哦,好吧。 教授:我的坏。 大量的写作。 大家好? 差不太多,对不对? 只需要一点点 同时工作,通过。 如果你打破它, 了解每个部分是什么 是指to--为 一切是, yes--打破它的小 问题,然后重新组合, 你可以做一些真棒的东西。 有答案,但我们做到了。 指针运算。 啊。 我的手都白垩。 因此增加或减少 INT调整指针 通过指针的类型的大小。 还记得每一个类型 具有不同的大小? 因此,像一张双人床或很长很长就是 八int是4,但焦炭之一。 所以,你想要做什么 is--有一点要记住 就是这样自己多 指针值实际上改变 将依赖于 指针的类型是。 每个人都好这个? 我可以删除吗? 我们是好? 真棒。 所以,如果我们有一些指针 that--这是要be--我 要使它为int的指针。 它存储了这一点。 如果你说的指针 加一,它会做 是它要更新 它由一个int的大小 因为这是 指针的类型是。 与C,一切都是 非常严格,规范。 整型指针会被更新 空间的int会走量。 一个int是4个字节。 那么,这会变成? 你只需添加4到这一点。 现在,鼠标指针会be--确定。 所以,如果它是一个字符,我们做了指针 加一,那会是什么呢? 如果started--假装我们 started--现在它0x08的。 现在,让我们说这是一个 字符指针,我们增加了一个。 会是什么改变? 多少个字节是一个字符? 听众:一。 扬声器1:一。 听众:那么0×09。 扬声器1:那么这将是9。 所以,只是要记住。 只是当你添加一个,它不是 增加一个,除非它是一个字符。 它增加多少 字节,它是类型, 这就是为什么我们有 这个等式在这里。 所以它的整数倍大 指针的类型。 所以我们这里的例子。 y为分配给该值,为0x4, 当我们做y加等于一。 是什么在这,什么是 x中,不改变。 是什么改变是什么y中。 存储在Y中的地址更新的四 因为有四个字节的整数 它是一个int指针。 行。 所以现在我们有另一个练习。 所以,问题是怎样将打印。 任何想法? 听众:数 在快乐的猫字符? 扬声器1:没错。 所以想用你的字符串。 大家都明白了吗? 我们希望通过它走? 是的,确定。 所以,我们这里 - 我 像这样这么多。 我不必 [听不清]可笑。 因此,我们有我们的字符串在这里,快乐的猫。 可爱的。 我们有一些计数器 我们跟踪的。 因此,我们有一些的char *指针 刚刚被设定为等于为str。 这是什么做的是它的 分配一些指针 给您的字符串的开头。 因为我敢肯定,因为它 提到在讲座中, 我们已经给了你们这 所谓的字符串数据类型。 但真正的字符串只是 数组of--喜欢的char *。 这是一个指向一串字符 这是连续的内存中。 因此,这只是设置它 等于任何字符串 确定在哪里 它的第一个字符是。 所以这只是设置一些点 等于该字符串的开头。 每个人都很好吗? 凉爽。 因此,这是我们的提领的指针。 因此,它实际上会 给我们一些价值在这里, 在我们的字符串,我们正在谈论的。 和我们说,只要 它不是空终止。 因此,继续下去,直到你得到 到字符串的末尾。 一个更新的指针。 以r,它实际上由一个更新 每一次,因为这是一个char, 将char *。 因此,它会去。 这将更新。 因此,首次运行时, 这将是在这里小时。 这将更新。 这将是一个。 这将是一个P,Y,等等等等。 我们将更新计数器。 当到达结束时,它 只是打印多远它得到。 是的。 听众:所以它统计 空间为一体,对不对? 行。 扬声器1:这样认为。 那是一个question-- 听众:[听不清]。 扬声器1:不用担心。 这是我做的。 好吧,这么一件事我 不解的是,有一个数组, 你也可以把它当作一个 因为指针数组只是 的存储器连续斑点。 所以,你可以把它以同样的方式。 你可以操纵他们 用指针了。 这样做时,而不是在本 情况下,类似的东西 将数组0等于1。 但是在以同样的方式 一个字符串确定 通过在何处开始 它的第一个字符是, 阵列由下式确定 其中,它的第一个元素是。 因为我们知道,我们是 保证的是,这些 将要连续 的存储器块。 这就是使我们能够做到这一点。 我们知道他们是连续的 的存储器块。 所以在这种情况下,通过解引用 只是数组,它告诉我们, OK,去开始 您的阵列,这是在这里。 所以,你可以将其设置等于一体。 在这种情况下,无论你的阵列 类型是,当你一更新, 这就像更新 它的下一个索引。 你可以这样做,因为你 知道什么是您的阵列中。 所以它知道多少 通过更新您的指针, 什么地址以更新其为这样 你是下一个插槽。 所以这只是一种不同的方式 写作阵列0等于1, 阵列1等于2,阵列 支架2等于3。 这只是另一种方式去思考它。 因为它们是连续的 在内存块, 你可以参考他们要么 通过notation--阵列 我个人 找到easier--但也许 你需要对其进行操作 严格的内存地址。 这是你会做的方式。 那种比较像一个 很酷的事情你可以做 对,也许不是你 究竟要执行。 我在61中使用它。 你们也许并不需要 不用担心太多。 但是,如果你有兴趣, 取61来年。 我们在家里舒展的家伙。 我知道,这是很长。 动态内存Allocation-- 所以我们知道,一个 事情过程中,当我们谈到 我们的第一款一起, 我们看一个交换 功能它是 外我们的主要功能范围。 和我们传递这些价值 这是有效的副本。 而一旦交换完成 执行时,它只是留下了一个堆栈。 请记住,我们有一个 堆栈帧的交换。 它的叶子和那些 数值离开它。 他们都走了。 我们不能做任何事情 他们和我们是悲哀 因为我们不能交换我们的价值观。 但随着C,正如我所说,你 有很多的力量在内存中。 所以,你可以做的是,你可以 分配在堆上的东西在这里 将呆在那里,直到 你告诉他们,否则。 他们就像好儿女。 他们呆在那里。 他们不离开。 他们将呆在那里,直到你 就像,OK,你可以走开。 而在堆栈上的东西,who-- 他们就像顽皮的孩子。 他们只会逃跑,当你想 在那里,然后他们走了。 你不能让他们回来。 所以is--我们要堆 谈谈malloc和free,这 我敢肯定你们 听说了讲座。 而这基本上是一个办法 有很执着的数据。 这样你就可以保持数据 各地,只要你想要的。 MHM。 听众:您可以定义堆和栈? 是他们喜欢的地方放东西? 扬声器1:因此,他们 基本上just--他们 我们指的只是内存的方式。 所以堆只是地方 存储器是动态分配的, 而堆栈指 更多的堆栈帧 这是更核心的 这是实际运行的功能。 你真的没有控制权。 最大的区别,你必须控制 在堆,如果你想。 你有过协议栈的控制较少。 堆栈取决于 功能正在运行, 和顺序,其中它们 运行,以及事情是如何返回。 而随着堆,为 我们会看到,你可以说, 好吧,我想这个值是 各地,直到我告诉你,否则。 你不准摆脱它。 你不能覆盖它。 你要保持它的周围 只要我告诉你。 你是老板堆中, 而stack--也许,如果你 像finagle你的方式 你可以成为老板。 但并不完全。 这真的只是存储器。 这只是不同的方式 的参考存储器。 凉爽。 因此,与那,怎么 控制你的记忆。 这是使用malloc,这 你会去用。 因此,这只是短期 内存分配。 这就是它。 还有一堆其他很酷的 功能有页头底, 他们代表不同的东西。 所以,当你需要的存储需要 拖垮你的当前功能,使 当你的当前 功能跑掉, 你仍然有数据,你 从中得到的,你要使用的malloc。 这将初始化它在堆上。 就像我说的,守 他说,你会继续在那里 直到你告诉它,否则, 这是这里最重要的事情。 所以,有一点要注意,和 这是典型的非常重要的, 的是,这和sizeof 就是用超级有用 因为根据其种类 机器你正在运行, 它可以具有不同的量 内存,它需要。 所以,你总是希望用这样的尺寸 你不是依赖于机器, 让你的代码 运行在任何机器上。 而这只是其中的一部分 编写好的代码。 如果它可以在一台机器上, 但不是任何其他人, 多么有用是你的计划吗? 所以,你总是希望 确保并用sizeof运算。 听众:那就是像 10英寸[听不清]大小? 扬声器1:这是由10个整数的大小。 是啊。 所以,整数的大小将返回 多少钱1取整数。 或字符的大小,如何 做多一个字符起飞。 然后多少块 那你想要什么? 所以在这种情况下,我们想要的东西 我们可以存储10个整数来。 它会不顾工作 机,这是很酷。 那么有多少字节将 这实际上给你吗? 快速数学运算。 听众:40。 扬声器1:40。 没错。 所以,再大的事情。 指针或内存分配可以返回null。 如此反复,经常检查, 看它是否返回null 之前你尝试做任何事情吧。 如果您尝试取消引用 这个指针现在, 它只是将段错误 因为你去,并试图 触摸空的时候,你不应该有。 因此,经常检查空。 同样,你所能做的。 它可能返回null。 如果你要么它会返回null 出的空间,或者因任何原因 它遇到了一些内存错误。 它有时只是返回null。 所以,你只需要检查它。 这就是这张幻灯片是说。 然后,我们所拥有的 这里是一个调用free。 所以用同样的方式,如果 打开一个文件,你必须关闭文件, 如果你的malloc内存, 你必须释放内存。 而你们将得到 做很酷的东西。 并有一个程序,你可以运行 看看你曾经泄漏内存。 但你不希望出现内存泄漏。 这是非常糟糕的。 刚刚陷入困境的事情。 这是不好做,就像编程 明智的设计效率。 但它也只是一种 坏了你的电脑。 所以只是免费的东西 当你的malloc他们。 你们看到的对称性在这里。 超级简单。 只是免费的,然后 无论你的指针, 无论名称 你的指针,它 将释放它给你的照顾。 凉爽。 然后,我们有这个。 因此,我们只是要 走过这个程序。 然后你们就完成了。 所以[听不清]刚为主。 因此,我们有一些为int *指针。 因此,我们有一个指针 这是怎么回事举行整数。 又有多少个整数是打算举行? 只有一个。 大小int的。 我们检查,看 指针是空的,因为它 是,我们想说什么也不做。 这是不好的。 因此,我们打印了一些错误出 存储器,最多返回1, 因为你们都习惯了。 然后,我们在这里,我们 我们取消引用指针。 因此,这意味着我们将要存储 什么在给我们的位置。 为int *指针,或者malloc的,返回 它抛开这个地址 内存给你。 因此,它基本上 给你like--,如果你 想想一堆 房子在附近 要放 你的家具,malloc的 就像是OK,你得到 去容纳三人。 和它给你的 房子3的地址。 所以,现在这个权利,这 指针存储地址, 存储你的房子的地址。 * PTR手段,OK,我在我家。 凉爽。 我需要得到一些整数。 所以,你问的人 现在给你的家具。 所以,你得到一些int类型。 它把它在你的指针 它的指向。 然后它只是打印 出来,你只要进入。 并且再次,参考。 所以,这就像你去这个 针对你所看到的在那里。 酷? 然后,当然,我们释放了指针。 不要忘了释放你的指针。 不要忘了检查空。 不要忘了释放你的指针。 你有两件事情你还记得 这一点,或者说你应该记住。 是的。 听众:[听不清]东东 这样,该字符* S。 为什么我们从来没有免费的? 扬声器1:嗯? 听众:是那些像琴弦? 你说的字符串 就像字符* S,对不对? 那么,为什么我们不自由的字符串? 扬声器1:您只 免费的,如果你mallocing。 听众:哦,如果你mallocing。 扬声器1:所以的malloc 自由是两回事 你应该总是在一起。 f开,女接近,两件事情 你应该在一起。 在这两个情况下,检查空。 是的。 听众:那么自由就是 让别的东西 之后被存储在那里 这个方案使用了吗? 扬声器1:这只是说, 好吧,我做了这个。 你并不需要保持它周围。 否则,您的计算机将 只是喜欢尝试,并保持它在那里。 然后你can't--运行 到后来内存问题。 你总是想释放它,因为 它告诉你的电脑,OK,我 随着内存这个地方完成的。 你可以把它背 我以后使用。 酷? 是的。 听众:所以我们使用了%D刚刚 因为两倍的回来了, 为什么is-- [听不清]。 听众:您可以使用%吗? 扬声器1:您可以使用%我。 在最后一分钟的问题吗? 前进。 观众:我只是有一个快速的问题。 所以PTR变量,that's-- 像,用INT * PTR = malloc的, 这只是说这是 指着memory--的地方 扬声器1:你想[听不清]? 听众:--that是的 大小of--没有,没关系。 但它只是指向一个地方 内存就像四个字节。 扬声器1:没错。 所以malloc的大小INT说, 好吧,我会去跑了出去, 发现四个字节的内存为您服务。 当它发现4 字节的内存,它 给你回的地址 在那里开始的, 这就是存储 在指针或PTR。 不错。 你们看比大多数少困惑 当我谈到指针的人, 所以我感觉很不错了。 行。 与往常一样,你们应该都 现在得到您的pset2成绩。 我知道发生了一些靠不住的 东西在那里说,公式无效 什么的。 如果你得到的是,所有的 你的成绩都在我的身边有效。 所以,我可以送你 你的成绩截图。 只是让我知道,如果你还有 缺少任何等级或某事 似乎没有什么意义。 到我这里来。 我一直引以为傲的超你 球员了,所以继续努力吧。 和你的周末好好休息一下。 我敢肯定,我会看到一些 你在上班时间。