JASON HIRSCHHORN:欢迎 四个星期,每次一片。 我们有我们的忙提前一周。 本周一和周三 上周,你已经被引入到 指针,所以希望有 吹你的头脑,但是希望不是 让你太糊涂了。 如果有,我们将在在 节今天以及我们要去 做指针。 我们要投奔的堆栈,该堆栈 我们在讲课讲到 了,我们要去暗示 东西来在周三及以后 在内存管理方面。 最后,我们要商量了一下 关于斯坦福便携式语言, 这是你们的图书馆 利用这个星期来实现 问题集。 正如我向你们上周 - 我想再次把这个向上滑动, 因为这是一个列表 可用资源 你CS50。 这些都是我们给你出的 框,这些是令人难以置信的 重要的是什么 下一张幻灯片将显示。 但在此之前我们得到的下一张幻灯片, 我想去过这些了。 对于每一个讲座,也有 注释所采取。 这是演讲的摘要,但它 也有代码段和帮助 技巧和窍门。 所以,如果您要查看的演讲 - 希望你没有错过的讲座,但 如果你没有,你应该rewatch - 但 当您要查看的讲座, 一定要看看这些 讲义。 还有源代码在线 从每一个讲座。 cs50.net/shorts很短, 6至12分钟的短片。 你们已经看到了很多人。 也有视频,我们不分配 给你,但封面主题是 本课程涵盖的讲座。 所以,如果你想更新这些 主题,你看看这些短裤。 study.cs50.net有引 上一吨话题。 它具有视频。 它具有实践问题。 这是一个奇妙的资源。 快来任何问题,但 也考考时间。 一对夫妇更多的资源。 有一个在man命令 终端给你一些 在一个特定的信息 函数或命令。 有谷歌,我最喜欢的资源 - 我最喜欢的资源。 我最喜欢的资源是最后一个, 我们会得到一个第二。 有cs50.net/discuss。 这是我们的班级论坛。 有办公时间周一至 星期四,上午8:00至11:00。 也有网上办公时间 延期的学生。 最后,如​​果你需要什么, 有任何疑问,意见或 关注,你有我 联系方式。 与我取得联系,谢谢。 所以当我暗示,下周三,一 从明天起一周,是你的第一 测验,测验为零,因为在计算机 科学,我们从零开始计数。 更多信息将在提供 明天的演讲,和一个手将 最终被发布到网上与更多 具体的细节,特别是 测验零的位置。 但它会将于下周三 而不是讲座。 有没有讲座下周一 因为它是一个节日。 此测验将涵盖所有的材料 从零一周到五周, 所以通过这个星期,通过 讲课的明天。 材料包括讲座。 材料包括部分。 材料包括习题集,和 尤其是开始部分, 在哪里你走了习题集 通过一些背景资料 你即将覆盖。 不要期待通过这些习题集。 为了帮助您所有的测验,下一 周一,即使它是一个节日, 该课程将举办 当然性检讨会议。 视频课程范围的审查会议 将在网上公布,如果你 不能够做到这一点。 此外,在第下星期二 我们会做一吨测验 审查并希望玩一些 危险为好,但我们要 是想在回答你所有的 的问题,但我会拿出 很多有帮助的问题 并根据信息 在10年测验。 我有一个什么样的一个不错的主意 要显示出来,以及如何的问题是 将要问,所以我们就去了 那些在节下周二。 此外,我并没有把这个向上滑动 上周,不过这是后话,我们 上周做了。 这是我们如何走近了很多 的编码问题,我们做到了。 我想提炼出我们的方法 成一些简单的步骤,可以帮助 你解决一个编码问题。 记得在上周,我们的二进制编码 搜索和我们做的第一件事 当我们需要编写二进制搜索 是我们在考虑我们 领导它是如何工作的。 我们没有画一幅画在课堂上,但 我问大家看短 视频,这也有一个图片 如何表示 二进制搜索工作。 第一,我们真正想做的事 明白了什么是画 图片来了解它的逻辑, 为了确保我们知道 这个东西怎么工作的。 接下来的事情,我们在一节没有你 上周我们把我们的精神 模型,我们把它 到一些伪代码。 伪代码,同样,编程类 语法在口头上,而不是C代码。 甚至具体到C。我们只是把我们的 思路,并采取了英语,我们使用 把它表达出来,并写出来的 某种方案的前瞻性的方式。 所以,这只是逻辑的一部分。 我们把我们的逻辑照顾第一。 我们分手了这个硬编程 问题分为两部分,并且我们把 关心逻辑部分的第一。 然后我们走近 语法部分。 记得在我们制定了 伪代码中,我们挑选出的部分 伪代码,我们知道映射到 在C中的特定元素,例如, for循环,if条件,或更大 大于或等于运算符。 最后,我们做的最后一件事, 我们做的最后一件事,是 在C代码其实这个节目 我们要经过这个过程 今天再次在一个比较大的 编码问题,将占用 散节的下半年, 但我想打好这个框架 在这里为你们。 这就是我们一直在逼近 在课堂上的问题,以及如何可能 你一直在处理这些问题 你自己以外的部分。 所以,我要离开这里了这件事, 我们会重提这个当 我们今天的编码后,去 系统通过这些步骤。 最后,反馈。 如果您有任何意见对我来说, 网站是在这张幻灯片的顶部, sayat.me/cs50。 给我一些反馈。 我得到了一些意想不到的反馈 从你们的最后一周。 你说你真的很喜欢 pseudocoding和编码,我们做到了。 也有人给了我一个链接到一个研究 这表明,等待 询问是否经过三至7秒 任何人有问题是最优 时间等待。 所以,如果你有你的秒表出来, 今天我要去尝试,等待7 秒后我问,如果任何人有 在移动之前的任何问题。 所以,在我们继续之前,是否有人 有任何疑问,这么远吗? 控制室给了我七秒。 OK,没人有任何问题,但 随时问他们,如果你这样做。 首先,本周我们将要覆盖 指针,因为我们暗示了在 议程在类的开始。 你见过在课堂上的指针。 他们可能已经融化你的心。 这是确定的,这就是他们对我做了 数百名CS50的学生在你面前。 因此,在未来10到30分钟,我们 要通过这些指针 慢慢地,系统地。 如果在任何时候你有什么 问题,请提问。 我保证,在此您同行 部分和在家里看有 完全相同的问题。 让我们来谈谈一般首先,我们才 潜入指针,有关变量 和数据,这我们已经 使用前被。 除了具有这些事 上一个幻灯片,我要去 画这些了。 正如这张幻灯片说,内存中的数据有 两者的值和地址,所以我们 要表示的东西 在存储器中。 记得上周,当你看到 正在绘制数组,我们一般画 他们为一系列框,因此我们将 只是画一个变量为一个框 某处在存储器中。 这个盒子在这个例子中,我们将 称之为X,并且它有一个值。 在这种情况下,我们正在初始化 该变量的值50。 您还会注意到,除了 刚刚的价值,这个变量x的 位置在存储器中。 事实上,你可能是有点 知道,内存有 有限数量的空格。 还有在你的只有这么多箱子 计算机可以存储的东西。 更好的是,让你知道的事情 被存储,每个方块有 特定地址,特定数量的 在这里你可以找到它。 就像新生都有自己的 在科学中心邮寄地址, 在内存中的每个方块有 一个特定的地址。 当你去到那个地址,你 能得到什么设在那里。 我要完全任意的与 这个变量的地址,但我 接下来要说的地址是123。 现在,我不只是写1-2-3。 我写了为0x123。 该0X部分表示这是 一个十六进制数。 我们不打算谈论 十六进制很多今天,但要注意, 当我们参照的存储器地址, 我们称它们为十六进制。 所以每当我在谈论一个 地址,我会把那0x开头,这就是 只是说123是 十六进制数。 它的基数为16。 它不是以10为基数。 没有任何人有任何 问题这么远吗? 完美的。 所以这是一个变量。 我们已经看到过,但现在我们 出发去引擎盖下,看看 什么是实际发生的事情。 所以,指针。 关于指针很酷的事情是, 不像有一个正常的变量 一些数值,某些整数,一些 性格,也许是一系列的 字符,如果我们谈论的 数组,指针具有值是 一个地址。 在屏幕上,我们与int x 等于50,我们之前创建的。 我已经画了框。 让我们也画一个框。 这将是 - 哦,我的天啊。 我们需要一个新的标志。 也不遑多让。 但我们要调用此框 - 这 在变量称为指针。 指针还具有一个地址。 这是在一个不同的地址。 这是一个不同的变量。 这不是要上 第一个的上面。 你可以不拿把两件事情 内部邮箱。 你不能覆盖初始 之一,所以我们要在 这里不同的地址。 我们给它的地址456。 但指针的值将是一个 地址,并且在这种情况下,它会 要解决的x变量的。 所以里面的指针,我们要存储 地址123。 我用的语法来写它 - 我们 要去了语法在 第二个,但要知道,在这个语法 幻灯片是你可以使用的语法 设置此情况向上 - 之前我们得到的语法,不过,我 要明确到每一个人, 确保每个人都明白, 从指针变量作为不同的 有一个地址作为自己的价值, 不为整数或字符。 到目前为止好? 一般也,当我们这些图纸 的东西,我不只是要 绘制地址在这里。 我要去参加一个箭头从这个 框到其他变量,它的 指着给予这个意义上说,如果我 分别来看看地址123,如果 我是用这个指针来查找 它的指向,我会得到 此框在这里。 我会得到数50。 是的,质疑? 学生:如果指针存储的地址, 那么我们该如何选择阵列,和int 明星,或像一个char 明星,或什么? JASON HIRSCHHORN:你能 重复的中间部分? 我失去了你。 学生:你如何选择阵列, 就像一个int星级或char明星,或 什么,如果它总是 存储的地址? JASON HIRSCHHORN:好问题。 我们如何选择什么,它实际上 指着若 总是存储一个地址? 如果不要写成整数星级权利 在这里,我写的char明星,这将是 指着 - 这是我们会写,如果我们想 它指向一个字符。 深,深跌的一和零 世界,那整数,即字符,不 真正的问题。 但在C而言,它要你 是相当具体的条款 类型你指向的东西。 的水平,我们正在编程, 我们将写 事情类型我们点 尽管它总是一个 解决这里面框。 你有问题吗? 确定。 现在我们要看看 一些语法指针。 在这张幻灯片中的第一行 - 整型明星,空间,指针 - 初始化并创建 - 没有初始化,而。 不设置它等于什么, 但它创造这个指针。 所以在我的图的形式 - 让我们去这一边 - 首行,诠释明星 指针,创建一个框。 这个箱子是指针变量, 它是在一个地址。 我们给它一个不同的 地址999。 这是所有行的作用。 我们之前已经看到这一点。 这就像任何时间,如果我只是 写诠释x那里,它会做 同样的事情,创造 一盒名为x。 在这种情况下,我们给 它不同的类型。 所以它不会是一个int。 这将是一个int明星, 所以此框将是一点点 比如果它是不同的只是 是一个字符,例如。 因为字符,召回,是 在内存中只有一个字节。 指针是四个字节。 所以这个盒子看起来有点 不同的,如果我们写整型明星作为 反对为char。 但除此之外,我们创建了一个 框,它是在一个特定的地址。 这是所有第一线一样。 代码的第二行,诠释x等于 50,再创建另一个盒子x在 不同的位置。 我们会给错位111。 这实际上是初始化 除了指针 创建框。 我们把50这里面框。 的代码,指针的第三行 等于地址X。 该地址操作装置 一个非常具体的事情。 每当我们把符号在前面 一个变量名的,我们在说给 该变量的我的地址。 所以,当我写符号X,这是 说给我x的地址, 这种情况下,111。 是吗? 学生:这是可以接受的,如果我们 碰巧知道这个地址 特定的变量只 说指针等于0x111? JASON HIRSCHHORN:所以,如果你知道, 这是在111,你可以写 指针x等于这个十六进制 号,但我看不到一个办法,你 会知道它是什么,所以这 为什么我们使用这个语法。 但同样,这符号X,符号 是说给我的这个地址 变量,就像任何相等 它的标志,这是该存储 值里面的指针。 所以每当你看到的符号, 认为这是给我的地址 这件事情。 符号x为给我 这种X框的地址。 同样,如果我们这样做符号指针, 那么我得到什么? 学生:指针的地址。 JASON HIRSCHHORN:地址 的指针。 具体是什么? 学生:0x999。 JASON HIRSCHHORN:999。 符号指针将给予 我在这种情况下999。 &符号在任何前 变量给你 该变量的地址。 当然,我并不真的在乎 该指针的地址。 我关心更多关于 这个变量的地址。 最后,我们将在最后一个符号 看到实际上是相同的符号, 该星号。 但在这最后一行,这是 用有点不同。 请注意,在这最后一行 它旁边的变量。 正如前面是旁边的类型,它 在这种类型的一部分​​,我们正在创建 这种类型的整型指针,现在 明星意味着什么 有一点点不同。 这意味着去治疗价值 - 整型指针 - 对待值这个变量一样 一个地址,去那个地址, 给我的价值。 因此,星号表示,再次治疗 值和指针作为地址,去 该地址,并返回该值。 在这种情况下,该值为50, 所以这行会的printf 50。 是吗? 学生:所以,如果我们想这样做的 这在过去是没有声明为 指针,如x上,并且该值是50, 它会尝试去解决50, 或将它只是给我们一个错误? JASON HIRSCHHORN:如果我们做明星的x, 并试图对printf的是,什么样的 编译器会做,或什么程序 它运行的时候会做,这是 将治疗50就像一个地址,然后转到 解决你的程序号50。 一般来说,当你要这些 随机地址,你不会 去到一个地址的东西 是不错那里。 你会去一个非常糟糕 解决你不应该去 对,和你的程序 将要崩溃。 所以,是的,你说得对。 它会做同样的事情,但 当我们试图去地址,我们 没有要求,否则我们不会有 宣派,或者只是随机的 地址,我们几乎总是在 麻烦,我们的程序崩溃。 这是否回答你的问题? 学生:是啊,我猜 我有一个又一个。 所以,如果你冷只是做到这一点,它会 去那个地址,有什么 点声明一个指针作为的 指针,如果我们可以只说一个指针 等于符号的东西? 然后它会像一个有意义的 地址,我们可以去那里,对不对? JASON HIRSCHHORN:你能 重复的问题? 学生:我们为什么要申报 指针作为一个int明星是否会 工作只是把它声明为一个像 定期诠释,因为它仍然会 有一件事,可能是 然后间接引用,对不对? JASON HIRSCHHORN:那么,为什么我们 它声明为一个int,而明星 而不仅仅是一个整数, 保存这个数字的呢? 学生:是啊。 JASON HIRSCHHORN:因为 当我们使用的东西 - 伟大的问题 - 当我们使用的东西,每当我们使用 一个指针,我们要 对待像指针,其他 事情是怎么回事,我不是要去 现在,它有助于进入 如果程序知道 这个东西是一个指针。 它将不同的方式对待它以某种 其他的方式,是无关紧要的对我们来说, 但我们要使用它就像一个 指针,我们应该说,我们要 使用这个作为一个指针。 以便基本上 指针是如何工作的。 它并不比更复杂 这一点,但遗憾的是,就变成了 很多更复杂时, 我们把它付诸实践。 接下来,我们要做的事情 东西蛮大的。 而不是仅仅是用几行 网上的代码,我忍了4,5, 6,7,8 9,10行代码。 和而不是编码这些了你 计算机或运行此程序 您的电脑上,我要你拿出 纸和一支铅笔或一个表 笔,并找出各是什么 这些代码的行做。 先从左边的列,从工作 从上到下,它初始化 有很多这些变量,并 然后再通过每一行代码中 右列和图 出会发生什么。 我给大家3分钟 启动这个你自己,然后我们将 过这作为一个群体。 让我们开始去 在此作为一个群体。 这是确定的,如果你还没有完成。 我要开始用左手 柱的侧面,然后我要去 请你们在这里,勇敢 你在这里你们当中了,执行 一行上的右手侧代码 列,然后我们将继续努力 我们的方式通过。 因此,首先,代码,int值,第一行 x等于2逗号y等于8逗号Ž 等于12,创建三个变量。 我做这一切在同一行。 这是一个方便的语法来创建 的多的东西 同类型在同一行。 因此,我们有三个箱子。 大家可以看到这三个, 或者是太低了? 确定。 我们有X,Y,Z。 及x,我们得到2。 在Y,我们得到8。 而在Z,我们得到12。 漂亮的标准为止。 下一步,我们要创建另一个 箱,另一个变量。 这是一个int指针。 这就是所谓的指针按x。 我们将绘制在这里。 而什么是我们存储 里面的指针X' 学生:x的地址。 JASON HIRSCHHORN:x的地址。 在这种情况下,不知道 x的地址。 它可以是任何东西,但我要去 做的东西了,现在做它 我们更容易。 我们将放置X在111。 所以,这得到0x111,我们会给 它一个很好的箭头来表示 它的指向为x。 同样,我有指针 y和指针的z。 他们得到的值。 我们会给这个0x222,0x333。 这是我们在初始设置 列的左侧。 我们创建了三个整数, 我们创建了三个三分球。 里面的每个指针,我们保存地址 三个初始之一 我们创建的变量。 现在,上的右手侧 专栏中,我们使用的是星号 符号中的一些不同的方式 所有这一切都没有用它来 提领东西或去 到一个特定的地址,并 返回值存在。 有人能告诉我是什么 代码的第一行呢? 有人举手。 谁一直没有发言。 你呢? 学生:设置Z到16。 JASON HIRSCHHORN:它的设置Z到16。 所以z等于x次年。 在这种情况下,它只是乘法 我们正在做的。 所以z等于x次Y, 2次8是16。 完美的。 因此,我们将更新此。 Ž等于16。 代码X空间是第二行 星级等于空间年。 这是什么行代码呢? 杰夫。 学生:x等于x次Ÿ? JASON HIRSCHHORN:完全正确。 这是速记符号 为x等于x次年。 你可能已经看到的东西 如x加等于y? 这是x等于X加Y。 在这种情况下,我们正在做的东西 有点不同,x等于x次年。 那么什么是我需要在这里更新? 学生:x是16。 JASON HIRSCHHORN:x是16。 变化的绿色是什么 我们迄今完成的。 接下来,我们得:y等于星级指针按x。 有人可以走我通过什么 这行代码呢? 什么是这行代码呢? 从一开始走我走过。 学生:它需要什么指针x是 指向,那就是作为价值 由尖,和 它存储在年。 JASON HIRSCHHORN:优秀。 我要重复一遍。 你做了出色的工作,但这样我们就可以 强调它,星号表示治疗 事情在变像 一个地址,然后转到它。 所以,对待事情的指针x像 地址,去它,把该值 16,然后我们只是节省 它在变量y。 所以,现在Y获取覆盖, 并且它现在是16。 码,星形指针的下一行 强调x等于x次年。 这是什么行代码呢? 同样,如果你是一个有点失去了这里, 从右到左进行评估。 那么盟,什么是正确的 那做右手边? 学生:右手边刚 乘无论是在 框是x和y。 JASON HIRSCHHORN:这就是16 16,有什么是平等? 学生:256。 JASON HIRSCHHORN:256。 哪里是我们节省了256? 学生:你将其保存在什么 指针x被指向, 这是X框。 所以,现在,x变成256。 JASON HIRSCHHORN:所以的明星, 再次,是指去。 我们去什么指针 x被指向。 它指向X,并有 我们节省了价值256。 关于具体的一个什么问题吗? 我们还没有看到使用上的明星 左手侧,然而, 赋值运算符。 所以这是代码的第四行。 代码第五行,有人可以 谁一直没有发言,给我的 第五行的代码,或步行 通过它和我在一起? 安妮,它是什么呢? 学生:改变指针的值 X要指针y的值。 JASON HIRSCHHORN:这是 完全正确。 指针y的值是这个地址 在这里,我们要存储在 变量指针按x。 因此,这成为222。 我要去移动的箭头, 同样,以表示它现在 具有不同的地址。 所以,现在指针下划线x 和指针下划线ÿ 具有相同的值。 这就是这一行呢。 所以基本上,他们是 都指向为y。 如果我们只是有我们的三分球,而我们 真的不知道该变量,我们 将失去按x。 但幸运的是,有x保存 在这个函数中,所以我们还是 知道其中x是。 但我们会看到,问题来了 以后,如果我们失去了一个指针 什么东西,我们可能实际上并不知道 它在哪里,或者能够恢复它。 但是,这是未来。 所以,现在,这是 完全正确,安妮。 最后,代码的最后一行。 有人可以给我什么样的 代码的最后一行呢? 是吗? 学生:它乘以什么是 指针Y,那么16倍16 - JASON HIRSCHHORN:16 没有指针年。 学生:嗯,它关系到该地址, 发现它,然后乘以 通过同样的事情 - 它的 同样的事情与指标Z,乘 值,并将其存储在X。 JASON HIRSCHHORN:完全正确。 那么我需要更新? 我应该x为? 学生:左上,256。 JASON HIRSCHHORN:什么 我将其更改为? 很抱歉,我们就回去了。 学生:它应该仍然是相同的。 JASON HIRSCHHORN:是的,它实际上 还是等于256。 但是,这是完全正确的。 让我们打破这种下降。 我们将看到在这里,这个东西在 括号,明星指针Y,即 把什么在指针y为 一个地址,去那 地址,取16。 所以,现在我们有一个16,我们很 相乘,通过对 在Z同样的事情。 去那个地址,服用16。 16倍,16是256,我们正在存储 这里面的x。 X里面已经发生了 等于256,所以我们不 要作出改变。 你没有这个文件,现在, 但在此源代码 部分,这将在网上进行公布 cs50.net/sections,我写的所有 的这件事,正是我们所做的。 我其实包含了一些其他的 信息在这里,我们是 要经过在一秒钟。 我们做这些操作,你可以看到 在这里,然后打印出 得到的值的特定变量的 已被改变​​。 此代码是已经被写入。 我要运行此代码。 现在让我们遍历输出。 让我们从头开始。 x值等于为2。 这应该是有意义的。 这正是我们最初 初始化它。 的x地址是这个疯狂的事情。 再次,我们却看到,即使它 看起来有点疯狂的在第一次 检查中,我们看到, 0X就在那里。 这是一个十六进制数。 然后我们看到所有的 这个疯狂的东西。 有一个B和一个f,和 还有一个C在那里。 这些都不是正常的零通过 九位数字,但因为十六进制 是基地16,你的实际需要 一对夫妇的其他符号 代表每个数字。 所以,再一次,我们不打算谈 十六进制太多,但知道 当你写的十六进制 数字,你会从零看到什么 到9加东西 从a到f。 因此,即使他们不是所有零 通过9号,这是一个 号,这是一个地址。 并且它可以被表示为 基地10,如果我们想要。 指针的x这里的值是 还一个十六进制数,并且什么是 它同样的? 什么是这个数目一样? 地址X的,对不对? 该生产线正上方,这两个 地址是相同的,这就是 我们所期望的。 x的地址是 指针的x值。 接下来,我们的地址 指针的x,便是 再次,一些随机数。 如果我们要检查它,我们注意到 它分享了很多 相同的数字作为其他的。 这是不同的,但它的股票 很多相同的数字。 记得谈论缓冲 溢出错误? 当你可以在写的东西都是 靠近你的内存,如果你去 超出阵列的界限。 同样,我们不打算谈 那现在,但对于那些你 好奇,这些东西实际上是 非常接近彼此。 这些箱子是相当接近 彼此在存储器中。 最后,指针x指向的 值,当然,它是2。 我这样做明星。 我们遵循的指针地址 x起初,它 返回x的值。 最后,我们清楚地看到 我们只是做了。 首先z为16,则x 是16,则y为16。 x最终成为256就在这里。 又一次,x没有改变 通过代码最后一行。 它仍然是256。 如果你想在自己重复这 再次,或者通过它,或 改变一些值了,我已经 已经写了这个代码。 您可以进行更改代码 而实际上看到这些变化如何 在现实生活中发挥出来。 在我们继续之前的指针,不 任何人有任何问题吗? 确定。 每个人都可以拿一只手,和 把它在空气中,和 - 闭上你的眼睛 - 把你的右手在空中为 拳头,并给我一个竖起大拇指,大拇指 向下,大拇指中间,怎么舒服 你是指针为止。 闭上你的眼睛。 确定。 你可以把你的手了 然后打开你的眼睛。 谢谢。 我们要继续前进。 我们将继续谈论 三分球,但我们要谈 关于他们在一点点 的不同的上下文。 我们要谈 数组和指针。 上周,记住 我吹你的头脑? 人的大脑,他们离开 他们在这里的地板上。 我敢肯定吹 那个人的心灵。 这是一个糟糕的玩笑。 [笑] JASON HIRSCHHORN:我要去 工作这一点。 但无论如何,我们发现字符串 出为数组。 数组实际上是指针。 这是什么意思了吗? 那么,如果我们创建一个6组 字符,这行代码 确实就在这里 - 字符,数组,打开支架,六,密切 支架,分号 - 再次,创建一个 数组的六个字符。 填充它。 我有一张它的照片就在这里。 这些盒子,我们看到,它填补 有一些字符和空 终止底。 和向下跌破,这就是我想要 你指挥你的注意力。 的第一盒 - 我们已经这样做过。 我们实际上已经做到了这一点 在每一个问题设定。 可以参考我在第一个框 这个数组作为数组支架为零。 我们已经做了一百万次。 我其实可以参考 同一个盒子的另一种方式。 我可以把它称为星阵。 因为数组,如果我们实际上是 打印出什么等于数组,数组是 一个地址,它是一个地址 在此数组中的第一个框。 让星算把什么 存储在数组作为地址,去 该地址,并返回 该值在那里。 星阵将返回f就​​像 阵列支架零返回f。 再次,到处都是我们一直在写 阵列支架零,星阵会 也做了同样的事情。 事实上,阵列支架是零 只是我们的糖衣 究竟是什么发生的事情。 这真是星阵是更 正确的做法,如果有一个正确的 这样,想到什么 实际发生的事情。 所以,这一切都很好,但 这里的那里得到神奇。 我们去的第二个字符 在这里,这个零。 应该是一个O,但我们会 给它一个零。 我们提到了前, 在一个数组第二个框中,为数组 支架一每当我们已经反复 通过阵列。 还有另一种方法来指 它,这就是下面的人。 那颗星,开括号,数组 加1,关闭括号。 所以,因为数组的布局 - 这些 箱子都紧挨着对方 在内存中 - 星阵去的第一个。 所以,如果我们要采取阵列 地址,把它加1,然后去 新地址时,这是怎么回事 要对旁边的事 原来的地址。 是吗? 学生:所以,如果是数组,而不是, 为字符,这将是整数,那么 你必须增加 4每次? JASON HIRSCHHORN:这是 一个很大的问题。 我想画的东西,然后再我 要回答你的问题。 为了绘制这个在屏幕上真的 越来越快速的前 的问题,我们有我们的阵列 - 而如此下去,但我只打算 专注于第一对夫妇的。 在内存方面,还有一个盒子 我们创建的时候,我们 初始化此数组。 这是数组变量, 并且它是一个地址。 它是,实际上的地址 第一件事情,第一个框。 所以这个箱子是什么地方。 这六个箱子在别的地方。 当我们这样做阵列支架为零,我们 要到达这里的第一件事。 当我们做星阵,我们将 得到确切的同样的事情,该值 该数组是指向。 当我们这样做阵列支架1,我们要 获得第二个盒子,而且还 因为指针以外的 括号,首先我们要添加 1到这个地址,然后我们要去 遵循这一点,给我们 第二个盒子。 等等,等等。 阵列加2是要增加2到这个 在这里讨论,因为再次,地址 只是数字表示 为十六进制,经常。 所以加2到它,并按照该 第三个框,这恰好是,当你 可以看到,两个空间离 从第一个框。 但愿,这使得它减少混乱 而不是更加混乱。 但并使它更加混乱? 再次,我会去你的 问题在一秒钟。 并使它更困惑 任何人,或没有任何人有任何 关于这个问题的想法 数组作为指针? 太棒了。 此外,它会很神奇 如果你有问题。 但在继续讨论你的​​问题。 现在的问题是在内存中的整数 占用四个字节,所以四盒。 如果我们认为一个盒子为一个字节, 整数占用了四盒。 所以说这些都是整数了。 这是一个int数组就在这里。 我会弥补一些 随机地址。 因此,如果这是一个int数组中, 第一种可能是10。 下一个的四盒了,因为 整数是四盒大。 还有的是10,11,12,13,所以 这个人会是一个14。 这个人会是一个18。 这一个将是22,依此类推。 如此反复,字符是一个字节。 他们是紧挨着对方, 所以这个图上我们在谈论 之前完美的作品。 但你刚才提出 整数的情况。 好吧,如果我说1到这一点, 它会去到11。 这将会是在这中间 INT,如果我跟着它真的 特别是这样的。 实际上,我是要去盒 由框在存储器中。 关于这种类型的很酷的事情 指针运算的程序 足够聪明,知道你的意思。 当你添加1到存储 这是指向一个地址 整数,它实际上并不打算 添加一个块以上。 这将超过新增四个街区。 这将是规模数量 为你买的大小。 这可以追溯到柯蒂斯的问题, 为什么我们做的诠释,而明星 不是char明星? 是你的问题? 有人问早些时候,对不对? 为什么我们做整型明星而不是char 明星如果它要解决不 不管是什么? 这就是来帮助我们与此 类型的指针算术。 如果我们的东西声明为一个char明星 但它确实经历 整数,当我们增加了1,那只 移动一个方块的,而不是 4,我们在逻辑上希望 它搬过来。 如此反复,在指针的算术运算,当 我们正在处理这些事情,比如 地址,然后加上或减去 他们,然后按照他们 弄清楚什么是内存怎么回事, 我们添加到他们的数量被缩小 按事物的类型的大小 他们指着。 所以,如果他们指向一个整数 - 我知道我重复自己 - 但如果他们是一个整数,你 究竟要动议4 箱子在每个时间。 如果他们是一个字符,你 要移动一个框。 如果他们是一个很长很长,这是八 字节,你要动 8盒以上。 的无论大小 数据类型,谁知道? 其实并不重要 我们的目的。 所有我们需要知道的是实际, 这道数学就在这里,只是增加1 将得到我们的第二个对话框,不论 是在什么类型的东西 那第二个盒子。 我希望有一些类型的问题 在这里,因为这是一个很大的,我 不能做一个完美的 工作在解释这一点。 真的吗? 没有问题? 对于观众在家里 - 我们走吧。 学生:如果你是做一个数组 在一个函数,你想让它 返回一个数组到别的东西, 你会怎么回呢? JASON HIRSCHHORN:非常好的问题。 所以,如果你想使一个数组中的一个 函数,然后返回数组 - 所以我们说,我们会做一个数组 在一个称为主函数。 主要调用这个函数,这 函数创建数组,然后 它返回到主。 现在我们已经看到的东西 之前与此类似。 在那里,我们看到类似的东西 其中主要创建数组,然后 该函数处理呢? 之前我们有什么写的 这样做了吗? 学生:排序? JASON HIRSCHHORN:排序 已经做到这一点。 15场比赛也做了。 在排序中,我们通过在阵列中,在 干草堆,然后我们整理了由 破坏性更新不同 部分在该数组。 因此,我们把我们的原始数组 - 记住,这些参数的一个 排序功能是数组 - 学生:这不就是一个全局数组? JASON HIRSCHHORN:对。 是啊,我们要回到那里。 但就在它被创建 - 它是一个全球性的,或者是它 在函数产生的? 让我们来看看。 我们可以回答这个问题。 它看起来像它不是一个全局数组。 它创造就在这个行 一个整数数组,然后它 传递给我们的排序功能。 因此,这不是一个全局数组。 它的主要创建,通过 我们的排序功能。 我们的排序功能破坏性 更新它,并返回它。 正如我们所看到了顶部,排序 - 哦,我的天啊,对不起。 学生:排序只是返回是否 或者不是找到了吗? JASON HIRSCHHORN:对。 抱歉。 实际上排序 - 让我们打开了。 排序是无效的。 排序不返回任何东西,因为 排序破坏性更新数组, 原始数组。 所以,这就是我们以前见过,但 你的问题是什么,如果排序 实际上创建数组? 学生:请参阅返回更新 数组,或者类似的东西。 JASON HIRSCHHORN:另一件事, 本来可以做的是所谓的主 的功能。 该函数的任务是创建一个 的东西,数组阵列 整数,然后返回 数组它的创建主。 所以,当我们交谈时以前见过 有关栈,我们要 今天晚些时候谈了一下,一旦 函数返回时,一切是 在该函数中所有的,创造 它的局部变量,走开。 我们以前见过的范围这一想法。 这就是为什么我们已经创建了全球 变量有时,为了躲避这个 事情要离开时的问题 其函数返回。 你会怎么做在这种情况下是 函数将创建数组不一样 在堆栈中的局部变量。 它会在不同的部分创建它 内存,可以让事情要 即使功能已恢复保存 和功能框,则 堆栈帧,已经离开了堆栈。 我将使用一些 术语在这里。 你不会听到这个 直到明天,但该地区 内存被称为堆,并 我不想去考虑这样做。 但是,该函数可以做,再次 过于简单化潜在的,是创造 在以不同的空间排列 内存,实际上在那里停留 只要你想让它呆在那里, 它会传回主指针 要保存在数组 内存的其他部分。 因此,它使一些箱子别处 不被摧毁时, 函数返回并传递回主 一个地址给该组的盒子。 这可能不是一个足以 回答你的问题,但 将要探讨的明天更 当你们聊 有关讲座堆。 让我们继续前进 - 哦,我的天啊! 这是一个海豚! 多么可爱的是什么? 上帝! 他们是我最喜欢的动物,所以 他们确实是可爱的。 我有三个海豚毛绒动物。 但足够的了解我。 你都有你的电脑 在你面前打开。 这里是你的编码任务。 我们将开始与伪代码, 虽然,所以不要太激动。 你需要编写一个程序,需要 一个且只有一个命令行 的说法,这就是数 海豚被训练。 这个数字应大于0。 接下来你要允许 教练进入了年龄 这些海豚。 每个年龄段,再次,应 大于0。 而所有这些年龄应该 被存储在数组中。 为了获得一个时代,但是,你需要 调用以下函数 原型 - 整型明星,空间,getAge,括号, 无效,关闭括号,分号。 最后,我要你打印出来 最古老的海豚的年龄。 如此反复,你开始写之前, 代码,有一张纸或有 gedit中打开,如果你想,写 一些伪代码这一点。 在三分钟内,我们将 走过去的伪代码。 你们还有三分钟 代码,然后我们就去了编码 它在一起。 如果您有任何问题,因为 这是不明确的,提高你的手, 我会回来的,我很高兴 回答你的问题。 但开始,走三分钟 写伪代码,以确保您 理解这个问题的逻辑。 让我们来刺在 伪代码为一组。 我要在黑板上写这 你给我的伪代码。 谁愿意给 我的第一行? 第一行的也许是最简单的, 所以如果你有不 还参加了,从这里开始。 什么是伪代码的第一行。 学生:第一行是来检查 那你得到的参数数目。 JASON HIRSCHHORN:完全正确。 检查数量的参数,第一个 的事情,我们需要做的。 接下来呢? 学生:检查该命令时, 第一个参数是大于0? JASON HIRSCHHORN:检查第一 参数大于0,是的。 下一行,继续前进。 学生:那么你很可能要 该命令行参数存储到 一个变量,或者你可以只 转到下一个步骤。 JASON HIRSCHHORN:是的,同样,我们将 有一个字符串在这里,但我们希望有一个 整数,因为它是一个数字, 所以我们需要做的 字符串转换为整数。 学生:X,Y。 JASON HIRSCHHORN:这是正确的。 因此,我们将编写一个。 字符串 - 哇,看那个标记。 这就是我们所需要的第二件事 这样做,拿绳子, 把它变成一个int。 下一步是什么? 学生:与创建整型数组 第一个命令行的大小 论点是不是编程? JASON HIRSCHHORN:对不起? 学生:只需创建一个int数组, 并使其成为命令的大小 那你有行参数。 JASON HIRSCHHORN:创建 大小的数组 - 我们会做精氨酸,无论 这样的说法了。 好不好? 下一步是什么? 因此,我们有数组,允许 教练员进入一个 年龄每海豚。 为了得到一个时代,调用一个函数 用下面的原型。 因此,我们有我们的数组。 什么是我们需要做什么? 学生:对于n海豚? JASON HIRSCHHORN:确定。 我打算写为每个。 对于每一个海豚,是什么 我们需要做什么? 来吧? 学生:调用该函数。 JASON HIRSCHHORN:通话 的功能,确定。 学生:在pseudocoding,你应该 这样定义在一个单独的函数 伪代码块? JASON HIRSCHHORN:所以,是的。 让我们做伪代码的一个单独的盒子 在这里,伪代码getAge。 所以这个函数,对于每个海豚 我们称之为getAge,并 getAge返回的东西。 那么,我们应该把 我们回国的事情吗? 它返回一个int指针,对不对? 这是返回类型,根据 该函数的原型。 那么,我们是否把 该整型指针。 学生:入阵。 JASON HIRSCHHORN:入阵。 这听起来不错。 调用getAge,把回报 在数组中的值。 让我们暂停getAge一秒钟。 我们会回来的。 我会让你开始 我这句话,马库斯。 但是,我们已经得到了每个年龄。 我们已经把他们所有的数组中。 我们做的到底是什么? 我们如何完成主? 什么是我们需要做的最后一件事? 奥尔登? 学生:我们可以对它们进行排序,并 然后打印的最大发现。 JASON HIRSCHHORN:我们可以 对它们进行排序,是的。 那么我们该如何排序? 学生:我们可以只喜欢 - JASON HIRSCHHORN:我们是否需要 在此排序,但? 学生:我想不会。 JASON HIRSCHHORN:确定。 之前你这样做。 什么是第一方式 你写的搜索? 学生:我们可以只检查每个 人反对对方之一。 JASON HIRSCHHORN:让我们做到这一点。 让我们通过搜索每一个和公正 跟踪最老的年龄。 搜索历史最悠久的,然后做什么 我们需要做的最古老的? 学生:返回它。 打印出来,对不起。 JASON HIRSCHHORN:我们走吧。 完全正确。 打印出最古老的。 确定。 马库斯? 学生:跟踪的 作为历史最悠久的您加入他们吗? JASON HIRSCHHORN:OK, 搜索历史最悠久的。 所以我们可以保持最古老的轨道 当我们把它们加起来有。 调用getAge,把返回值在 数组,然后看看这是 目前最古老的一个,也许救 它在一个不同的变量? 这将正常工作。 这实际上可能会节省我们 行,但是这是梦幻般的。 我要离开这个 在这里现在。 但是,如果你想在你的 实施把它那一步 进一步,那将是巨大的。 马库斯? 让我们做getAge在这里。 MARCUS:确定。 问一个年​​龄的用户。 JASON HIRSCHHORN:问 用户一个年龄。 确定。 可大家都看到了吗? 在这里? 好吧,询问用户一个年龄。 坚持下去,你得到这个。 MARCUS:我想我真的不知道为什么 最好是返回一个int比星 只是一个int,然后像只 返回年龄来存储它。 JASON HIRSCHHORN:这不一定 不如归去。 它会很好的工作回国, 但我希望你为返回int明星。 MARCUS:确定。 我真的不知道是什么 - JASON HIRSCHHORN:确定。 没有任何人有任何想法? 我们要求用户一个年龄。 我们得到一个整数。 确定。 那么,为什么不我们在这里暂停一下。 我们打​​算去我们的下一个步骤 逻辑,映射这些东西,看看, 然后你们将代码首先 部分,以及代码了这一切 在一起,但一个特定的getAge。 我们会弄清楚这是怎么回事 在与该整数明星。 但在此之前,我们这样做,我们才跳 成C代码,可以有人指出 有些事情,他们在我们的伪代码见 这将映射到正规的代码? 在C? 所以有些事情在伪代码,有些话 你看,有的缩进你 看,一些事情,给你一些 有关如何在C代码这个提示? 学生:For循环。 JASON HIRSCHHORN:在哪里? 学生:对于“每一个”海豚“ JASON HIRSCHHORN:确定。 我们走吧。 我们已经有了一个循环那里。 还有什么? 盟? 学生:为int的字符串 事情将是一个为i JASON HIRSCHHORN:确定。 因此,我们在前面提到过的功能。 我们看到其他的东西? 学生:printf的。 JASON HIRSCHHORN:没错。 不是很明显,但我希望我们有 现在有些熟悉的printf。 还有什么? 是吗? 学生:读一个数组是 只是声明了一个数组? JASON HIRSCHHORN:确定。 大小arg的话,。 这是正确的。 我不知道写的是​​什么 为,但肯定的,宣告之一。 另一个词来创建它。 我们看到了这里的任何其他的东西? 结构我们知道吗? 什么是线“的搜索 为最古老的?“什么样的 结构可能使用? 奥尔登,你建议。 学生:只要搜索。 所以像只是一个循环。 JASON HIRSCHHORN:一个循环。 所以,他们的搜索。 你可能谈论线性 搜索就在这里,所以它可能 只需使用一个标准的循环经历 一切,这就是为什么 柯蒂斯认为,我们可以把 它在先前的循环。 我们看不到任何其他的东西? 检查参数的个数数。 我们如何检查什么吗? 学生:如果报表。 和 JASON HIRSCHHORN:这是 一个if条件。 那么,你为什么不上手 该编码方案。 你有伪代码在这里。 开始写在C代码。 再次,我们要弄清楚什么是 与整型明星和事 我们如何能真正编写这个程序 所以,它符合 规格我给你。 如果你想,但是,启动 只有整型得到无效。 它只是返回一个整数。 这有助于你走了。 只是代码的。 代码它只是返回类型 作为一个int,而不是作为一个int明星。 但是,我们打算把它变成 整型明星再次使我们能够顺应 该规范。 也探讨如何访问一个实际 得到什么杰夫 说起早期。 因此,需要三到五分钟 编写这一点。 我们将通过 这个代码放在一起。 如果有缺少我道歉 澄清这种某些部分。 但我们要看看什么权利 现在的问题是我已经打完了所有的 它是什么样子的代码 如果我们只是返回一个 整数与getAge。 我们将通过该代码,并 然后我们会找出我们如何能 真正得到它,以配合什么 要求我们要返回一个int明星。 下面的代码。 再次,我向你道歉,我们不能 编写了这一点作为一个群体,但我想 以确保我们通过它。 对于顶级的,我们有我们的函数 原型,getAge。 之前我们已经看到了。 返回类型,然后再 名称,然后参数。 在这里,我们包括 三个库。 有人可以告诉我是什么 这一行12呢? 夏普包括标准live.h? 这是什么线路呢? 如果我要问你这个上了白卷,并 我问你给我的答案 两句话,你会说什么? 学生:[听不清] 允许你使用所有的功能 存储在该文件中。 JASON HIRSCHHORN:这是 一个很好的答案。 这是header函数具有 的多个函数原型 如果你要使用那些在 您的图书馆,这是说这些 功能存在。 我需要什么别的事情可做,如果我 包括,比方说,CS50库? 我需要什么别的事情可做的时候 我编译我的程序? 学生:[听不清]包括: 使用它的破折号升。 因此,我们需要在那些CS50库链接 与破折号升站立链接。 在实际的那些破折号升CS50链接和 零,实际执行 的,也就是说,得到的字符串或得到诠释。 所以后来我们在主。 确保用户输入一个且只有 一个命令行参数。 就像我们的伪代码,我们有 如果这里调理了。 我们希望,你们是很熟悉 用这条线,并能​​够 写这段代码很快, 检查的argc。 接下来,我们正在做一个给我行。 同样,你以前见过的。 这是将字符串转换 为整数。 接下来的事情我做的是我 另外,如果条件。 我确保他们进入了一个积极的 每海豚的数量 规范,检查是否 海豚是小于1。 所以,再一次的第一部分 代码,这三样东西 - 检查args来数,n,如果 它是大于零 - 你写的代码很多, 验证用户输入。 你应该很熟悉 编写该代码,并能够 很快写。 下一步,我们初始化一个新数组。 什么类型的东西都是我们 把这个数组? 每一次这样的整数 三个字符。 接下来,我们得到的年龄,和一个正常的 用于遍历数组迭代, 我们正在调用这个函数getAge, 存储的返回值 getAge阵列中。 同样,你写的代码一样 这个有很多之前了。 有一件事,希望你会搜集 从去通过你的过去 这个测验的问题是,很多 你将成为怎样继续做 有些事情你已经做了。 这是非常重要的,看看那些 模式,让你不会 使您的工作在超硬你 未来通过思考我从来没有做过 这之前。 你以前做过的所有的这些东西。 接下来,我们的代码最终行。 我们跟踪的最古老的时代, 经过各年龄,就像你 建议,奥尔登。 如果目前的事儿岁 我们正在通过迭代较大 比我们保存的最古老的号码, 我们更新了最古老的数目。 终于在年底,我们打印 出的最古老的数目。 同样,你这样做之前。 你实际写入线性搜索。 你需要写一个。 这是一个有点不同。 你正在寻找一个具体的数字, 不是最大的,但 你以前写了这个代码。 最后,在诠释getAge, 你以前见过这个。 我们有一个do-whil​​e循环问 用于用户输入,直到它 满足一定的条件。 最后,我们只是返回 该整数。 因此,所有这些代码你已经看到 之前和之前写的。 这里没有什么是新的。 当然,我介绍它在一个 不同的方式,我也许太 我的方向混乱, 但你以前见过这个。 这个逻辑你是有能力的100%。 如果我们运行这个程序 真的很快 - 我已经做到了,所以 我们将运行。/教练机。 发生了什么事? 学生:[听不清]。 JASON HIRSCHHORN:我没有 给任何参数。 让我们培养5海豚。 那将是二,三, 四,五岁。 正如你可以看到在这里,它 打印出的最古老的时代。 因此,让我们重新回到gedit的。 不过,当然,这不是什么 规范是要求。 这是问的原型。 没有回报的整数,但 回报在整数明星。 所以,如果我要去那里改变它 在原型我更好 在这里改变它。 现在让我们通过工作 这,就在这里。 让我们从最底层做起。 年龄不是一个int明星。 年龄是可变的是什么类型的? 学生:一个整数。 JASON HIRSCHHORN:所以线63,年龄 不应该是一个整数。 它应该是一个int明星。 我如何让它一个int明星? 学生:[听不清]。 JASON HIRSCHHORN:把一个明星在那里。 现在让我们来看看这儿吧。 67,调用getInt返回一个整数,而我们 存储在年龄该整数。 但是,如果我们对待年龄为 现在指针,我们怎么需要 更新此行? 学生:把一个明星。 JASON HIRSCHHORN:将 岁前的明星。 那是你说什么? 学生:是啊。 JASON HIRSCHHORN:对。 因为调用getInt返回一个整数。 我们想去给位置 我们的年龄,把一个整数那里。 如果我们做这行代码,我们会去 回到了柯蒂斯在谈论 早些时候,节约的时代,一些疯狂 整数,也许整数5。 最后,我们尝试去位置5 在内存中,而我们在很多得到 该烦恼。 因此,我们需要一个明星 还有,和第69行? 同样,年龄,它在内存中 就在这里解决。 那么,我们如何需要更新这一行? 别人? 我们如何需要更新这一行? 学生:将一个星号出现。 JASON HIRSCHHORN:完全正确。 添加一个小星星就在那里。 现在,我们正在提出的价值 由年龄而不是年龄。 所以,再一次,我们看到这个代码去 从整数到终点。 非常相似。 我们需要寻找那些地方我们 有年龄,我们需要改变他们 一点点,因为我们不希望 变革时代的盒子这么多,什么年龄 是指向。 和返回的年龄,是正确的? 这是正确的,因为 年龄是一个int指针。 是啊,问题吗? 学生:我们可以将它诠释年龄 贯穿始终,并在​​最后时刻,把 在时代前面的符号? JASON HIRSCHHORN:与 返回它的地址? 这是一个非常好的问题。 你可以做到这一点,但让我们来 在第二和答案 问题在第二。 奇妙的问题。 在这里,如果我们打开一个int 指针,什么类型的东西是 海豚的年龄存储在里面? 如果我们返回一个int指针向右 在这里,什么类型的东西 海豚的年龄存储在里面? 整型指针,所以第37行 应该是int明星。 这就是这个数组的类型。 这不是存储整数了。 它的存储整型指针。 终于到这里,海豚的年龄 支架我,那将会给我们, 再次,和整型指针。 我们不希望一个int指针。 我们想要的值指出 由该整数。 于是哈桑,我们如何能够 改变这一行? 学生:把一个明星? JASON HIRSCHHORN:完全正确, 把一个明星在那里。 这会给我们一个值。 怎么样线51? 学生:另一个明星。 JASON HIRSCHHORN:另一个明星。 这是完全正确的。 所以,我们正在处理,现在再次,这些 事情如int的指针。 学生:是不是在所有问题,在 getAge,诠释星级年龄从来没有放弃 E位置? 杰森HIRSCHHORN:这是一个问题,即 整型明星的年龄永远不会给出一个 位置,这将是一个类似 问题你是什么 与刚刚回国说起 符号的年龄和 保持它作为一个int。 但我想先运行此代码 看看会发生什么。 确定。 所以变量年龄UNITIALIZED 这里使用的时候。 所以说,“初始化变量 “年龄”来关闭此警告,“它 建议给它空。 让我们给它空。 因此,我们应该摆脱THA警告。 我们应该能够编译。 多大年纪是海豚? 比方说,1。 赛格故障。 所以,我会去通过GDB现在,我 鼓励你去通过GDB上 你自己去弄清楚为什么这 程序只是赛格故障。 我不会离开这个作为 悬念,虽然和我要去 打开这个功能。 我们要去理解为什么 这个程序段故障。 所以,大家都在栈上,当 函数被调用时,一个托盘被添加到 众所周知栈,本地 变量被存储。 当函数返回时, 该纸盘消失。 这些局部变量走开为好。 诠释星级年龄等于null是一个本地 变量保存在堆栈帧。 当此功能消失,这 变量消失为好。 所以,我们通过对地址 的一切。 我们通过对年龄。 这是一个地址,我们通过上。 但最终,我们 - 对不起,我自己走在前面。 为什么这个节目真的赛格故障的 这种情况下是因为年龄为指向 为空值,它是一个特定的位置, 和null是你不是一个位置 不准碰。 所以,当我们试着写这行 的代码,将年龄和做 那里的东西,我们就麻烦了, 而这也正是我们赛格故障。 因为明星的年龄,年龄再 是指为null。 我们希望为空,这是一个坏的区域。 我们试图调用getInt有,1在我们的情况下, 而这也正是我们赛格故障。 但是说一个选择的情况下,说我们 给了这个合法地址 就在这里,就像bf4ac,东西 我们之前看到的。 即便如此,当这个程序返回, 我们会碰到一个问题,因为 该地址就会消失。 局部变量的地址 会消失。 不管年龄是指出不会 已经存在了。 我们修复的方法是 你见过的东西 之前,malloc函数。 你已经被引入到 该malloc函数之前。 你见过吗? malloc的给你一些内存 不会消失的时候 堆栈帧消失。 所以写这行代码 - 我想给 它给你的现在 - malloc的。 而且,由于我们要存储一个int,我们 打算将malloc足够的空间。 我们要去说放弃 我一箱大小为int。 malloc的返回地址,我们 节能年龄的地址。 现在,当我们运行这个程序 - 我们不会向赛格错,因为 记忆体区块,我们通过了 malloc的不消失时, 堆栈帧中消失。 他们住,直到我们想 要摆脱他们。 而这又回到你的问题, 杰夫,从早期。 我如何创建的东西在我的 我想以后使用的功能 在主要的或不同的功能? 我使用malloc,和我通过 围绕他们的地址。 这是一个很大,无可否认, 覆盖刚才。 所以,请,如果您有任何 的问题,问了。 学生:所以的malloc不上 堆栈了,然后呢? JASON HIRSCHHORN:这是 完全正确。 盒子的malloc是给你 是不是在堆栈中。 它把它给你在这个部分的其他 内存,并且我们要 谈谈在讲座上周三。 这个名字是堆,但我不希望 要过多谈论它比其他 那就是没有得到这个其他地方 当函数消失删除。 还有没有其他问题? 学生:我想如果你没有使用 单独的函数,你把所有这一切 代码放到主,你仍然会 需要使用malloc? JASON HIRSCHHORN:大问题。 这可能不是最有效的 写这个程序的方式。 你可以很容易地做到了这一点的do-whil​​e 圈主并保存 自己一大堆的麻烦。 为什么我想要做这样的原因 这是因为我想大家 可以看到在主, 我们可以创建一个数组 指针,INT指针。 我们可以初始化这些指针 别的地方,把他们在这个其他 内存区域停留,只要 我们希望它留下来,然后我们就可以 后来访问它们。 例如,我们在这里搜索 通过他们。 我们可以做其他 活动它们。 我们也可以得到他们 发现的平均值。 我们可以做很多事情。 问题的关键是,你可以跟踪 有些事情在通过主 一个数组,创建某处那些事 别的,然后仍然使用 他们稍后。 而这种想法,我们现在正在做什么, 要来了很多在未来 P-集合,你要解决的问题。 这就是为什么我们做了这样的连 但无可否认它是一个费解 在此上下文中位。 学生:[听不清] 如果你可以把所有的整型年龄为 相对于指针的实际值, 可能你现在使用的符号的年龄? JASON HIRSCHHORN:对不起? 学生:如果你拿出星星 所有的年龄了,只是没有回报 符号的年龄,到了最后, 将这项工作? JASON HIRSCHHORN:所以的malloc 返回地址。 学生:行吧。 JASON HIRSCHHORN:它返回一个地址, 这样的年龄必须是一个整数 指针,因为它要 被存储在一个地址。 我们还剩下六分钟。 我将跳过说话 有关堆栈现在。 我要进入​​3分钟 简要地对SPL,最重要的 事情我认为你需要 知道问题集。 然而,在我来到这里,因为这 就是我们要完成的, 最后两个提醒。 其中,无可否认,我们透过事物去 很快在这一节。 我该道歉的步伐。 如果您有任何问题, 这是我们走过去,为什么东西 工作方式也如此,还是我的东西 不解释的清楚,因为我可以 有,请拍我的电子邮件或谈话 我下课后,我会很高兴 解释给你更深入。 所以,请伸出手,如果 您有任何疑问。 再次,反馈网站也是如此。 花一些时间下课,如果你有 它给我一些反馈。 我明白了很多。 正如你看到的在类的开头, 我通过他们读,作出回应 如果你想有一个回应,我 你认为这个心脏。 这意味着很多给我。 让我们通过谈论下课 你要去图书馆 要使用这个星期。 你可能见过这样的代码就是我 之前在屏幕上,GRect 桨等于newGRect,(X, Y,宽,高)。 你们有可能通过读 通过规范感到相当 熟悉这一点,但对于那些 谁是不太舒服,因为你 家伙,好了,我想重新过这 行,看看它是如何相似, 我们以前曾经使用过。 就像任何变量 - 这是一个对象,但就像对待 任何变量,我们有第一型 最重要的是在这里,GRect。 接下来我们的对象的名称,并 最后我们有功能 初始化它,给我们 我们想要的桨。 有时候我们写整数x等于5,而 我们直接初始化的东西。 有时候我们写字符串 名称等于得到的字符串。 我们用一个函数来得到的东西, 我们采取它的返回值,并 这是我们的新的价值。 因此,我们已经看到过这样的想法,其中 ,可能会或可能不需要的功能 输入实际创建的东西 对我们来说,而不是 我们直接创建它。 所以,我们以前见过这种代码。 我们希望,这个想法的对象,或 至少创建一个对象,是不是 压倒性的,如果你能概念化 它只是非常类似的东西 我们以前见过。 然而,关于对象的很酷的事情 从变量不同的是,我们 可以做的事情与他们。 你不能改变的颜色 变量,但你的确可以改变 一个对象的颜色,或至少 在SPL中您可以更改 颜色你的对象。 在不能移动的变量 一个窗口,但可以移动 一个对象中的一个窗口。 你可以得到一个对象的位置。 你不能真正得到 变量的位置。 这是对很酷的事情 在这个库中的对象。 然而,这些功能都可以 那种被混淆。 我们还没有真正使用的功能或 对象之前,所以我觉得这是 有助于了解一个通用的方法 明示或做事情的对象,或 理解对象。 正如你会发现,我有两个 这里写的函数,函数 你见过前 - 添加,窗口 逗号桨,并设置颜色 桨逗号黑色。 在这两种情况下,我们有一个函数 有两个参数,并 做一些事情。 现在,更一般地,所有这些 你要编写一个函数 要处理的对象 采取地方和什么。 A其中是您想要的对象 做一些事来,在这 情况下,一个窗口或面板。 而什么是你想要的 要做到这一点,或给它。 当你设置颜色 什么,在哪里 您设置的颜色? 随着桨对象。 和你设置什么颜色的? 黑色。 与add函数,其中 你在做什么吗? 与窗口对象。 什么是你给了吗? 你给它的桨。 你会发现,你的功能 使用时,设置颜色,设置位置等 等等,等等,所有 遵循这个模式。 他们把你想要做的事 东西,该对象想要 做的东西,你想什么 用它做什么,或者你想有什么 改变,或者你想有什么 加入,或者在特定的颜色 你希望它是。 或者,如果它不填,你要 使其填充,等等,等等。 诚然,一个非常简短的讨论 斯坦福 - 是什么呢? 斯坦福大学编程库? 便携图书馆,这是正确的! 谢谢类。 斯坦福便携式图书馆。 但同样,很多更多的信息 在问题设置规范给定的,但 希望这使得它一点点 更易于理解对象, 尤其是当他们已经​​与 我们已经看到和以前做过的事情。 所以用一点,那就是本周四。 享受学习 堆的明天。 好运气在下周您的测验,但 当然,我会在那之前看到的, 希望在节下周二。 但也如果你有任何问题, 意见,疑问,请随时 伸手。 下了课,我就到外面,如果 你想谈谈你的问题 设置或有一些问题。