JASON HIRSCHHORN:欢迎 到A5,大家好。 我们有一个令人兴奋的一周摆在我们面前, 主要是因为有这么多新 面临着在这个房间里。 这是美妙的。 很多你在这里意外, 这是更好的。 所以希望你会继续加入我们的行列。 本周我们将花 大头的部分 准备测验。 因此,根据我们的议程,我们要谈 一点关于该类资源, 而且对测验,然后,再次 花大量类的说话 有关的问题。 一旦我们做了回答您的 的问题,或者如果您的问题 自然使我们联想到一些编码,我 有从期中考试样题 过去,我们将在部分实时代码 同时也带来了一些其他的 好的选题覆盖。 因此,首先,因为我们已经经历了 过去几周来提醒​​你 伙计们,有一吨的资源 提供此课程。 他们中的许多将是难以置信的帮助 你为你继续 对于学习测验0,因为 这是周二下午。 因此,所有的你一直 研究了一下。 有讲义和源 代码,您应该 一定要看看。 观看短裤。 退房study.cs50.net。 然后,在下面列出,一​​个数 的其他资源。 再次,测验0就是明天 1点。 如果你还没有这样做的话,请检查 列于本公司测验0文档 当然主页搞清楚 在那里你正在做测验。 测验开始于1:10和 端70分钟后。 所以,如果你1:10以后出现,你 会得到很多更少分钟 70比拿测验。 所以一定要确保你有时间。 如果你是一个扩展学生或有 其他一些测试方面的考虑,它 可能不会在明天凌晨1点。 但同样,检查关于测验0 记录,以确保你知道什么时候 你服用的测验。 我写75分钟在这里。 我认为这是正确的,而不是70。 它涵盖了所有的材料从一个星期0 在周三上周的演讲。 再次,这个测验,即每 文件,你得到一个双面和8 1/2 11张纸上,你得到 测验期间,作为笔记使用。 很多人,如果不是大多数人来说,有 发现的一个最有用的方法 以研究为竞猜是 做一个研究表, 1-Sider的自己。 所以看过去的,如果 你看过过去的。 接触到的朋友,看看有什么 他们穿上他们的。 但实际操作下来,最好的办法,你可以 学习是要经过的一切, 惠特尔下来到什么应该或不应该 不属于重要的是表 纸,因为这只是一个非常 有用的方式为您确保 你正在经历的一切, 与它有一定的了解。 大多数人来说,我们发现,即使它们 已在纸张右边坐着 在他们旁边的测验,不转 它,因为,同样的,这很 在经历了信息化进程 帮助他们学习。 没有任何人有任何疑问, 有关测验0? 有大家 - 我不会做举手。 没关系。 我正想问问谁 开始学习。 但我不想让你 所有不请举手。 所以,就像我说的 - 是的,AVI,勇往直前。 AVI:什么会是一个有用的东西 穿上一个寻呼机? 学生:这是给你的。 JASON HIRSCHHORN:你得到 使用你的判断。 有用的东西要放在一个寻呼机, 如果你感到困惑的大O 不同类型的搜索的运行时间 和排序,把那上有一个中 方便的花花公子图。 这样一来,如果你问的 小测验,你不需要尝试和数字 它或理由通过运行时。 你可以把它复制下来。 如果你看看过去的测验,很多 次,还有的运行时间问题。 因此,这将是一个很好的一个例子 东西放在你的一个寻呼机。 其他好东西穿上,如果你 困惑如何声明 功能或什么的不同部分 函数的声明是,写 那在那里,一个通用版本 然后也许一个例子。 如果你感到困惑的指针, 如何指针工作是示 大概真的很有帮助。 如果你感到困惑递归,一个 样本上有递归函数 也可能被证明是真正有用的。 这是否给你一些想法? AVI:你需要了解的 整个编译过程,就像 怎么所有的作品? JASON HIRSCHHORN:一切 已经可以覆盖 显示的测验。 问题 - 但同样,有些事情会 权重比其他人。 有些事情已经再次出现 并再次在课堂上,在 讲座,以及部分。 其他的东西都没有 想出经常。 我们已经谈了很多关于#include和 -L的东西,这些东西在的意思 编译过程。 我们已经谈了很多关于GDB,保鲜, 那些我们用不同的标志时, 我们编译的东西,什么 make15,例如,真正 手段和确实。 我们还没有谈论的很多关于 在每一个步骤 编译过程。 我们仍然谈论它。 所以它仍然是东西,你 应该熟悉。 但同样,我们不会是 - 事情往往拿出在课堂上 更有可能想出更多 常和更重 加权测验。 凉爽。 有关测验0没有其他问题? 好了,我把名单 题目在黑板上。 我通过教学大纲去了。 我通过从审查部分去 昨晚那些幻灯片上来 与主题的不完全清单 我们已经介绍了迄今为止在CS50 而事情可能 出现在测验。 所以我不打算去通过 这些每一个。 这将需要更多的 时间比我们现在有。 但我要把这段话在这里希望慢跑 你的内存,以事情,可能 或可能不熟悉你。 而且我很乐意花大量的 部分回答你的问题有关 这些题目,主题, 这里不包括在内。 我们可以写伪代码。 我们可以编写真正的代码 以确保您 - 我可以回答你的问题,并帮助 每个人都从根本上理解 很多这样的主题让你会觉得 准备和舒适进入 测验的明天。 所以,在阅读列表。 希望你们都来节 有一些问题也是如此。 当你准备好,举起你的手 我们将开始。 请记住,这些问题你有, 没有愚蠢的问题。 我们已经听说了很多。 和你有问题,我愿意 打赌,很多人既 坐在这里,看 网上也一样。 所以你只能帮助人们 通过提问。 马库斯。 MARCUS:堆栈之间的 堆,就是有一个预分配 这被定义为内存的百分比 这是堆栈或堆? 或者,请问是怎么工作的,到底是什么? JASON HIRSCHHORN:大问题。 我要回追查一点点。 请问大家 - 请在这里是诚实的。 我知道我在问你提高你的 手在你同行的前面。 但有没有人觉得谁 难受的是栈和堆 并想说明一下 和那些什么意思? 如果举起你的手 - 确定。 谢谢。 所以,我们要投奔的堆栈和 堆真的很快,然后 进入回答你的问题。 所以,如果我们画了一个框来表示 内存在计算机上,都有些什么 事情往这个盒子? 主。 一个主要功能。 哪里主去了? 学生:[听不清]。 JASON HIRSCHHORN:所以我们会 把主要这儿吧。 在此框中去还有什么呢? 学生:你调用的函数。 JASON HIRSCHHORN:该功能 我们称之为。 他们去哪儿去了? 生:在堆栈中。 JASON HIRSCHHORN:他们 走在栈中。 所以,我们要调用这个 这儿的事情堆栈。 而往上顶,我们有堆。 所以内存是不是就像这样一个盒子。 但它实际上是非常相似的。 这将是一个很大的箱子超过 并且,这取决于有多大你 计算机是或有多大你的内存是。 在报价引文结束“底” 是堆栈。 并有多个事 即进入堆叠。 而那些依赖于功能 你在你的代码。 你总是有一个功能在你的 代码中调用主,所以总有一个 下节在这里 堆栈致力于主。 这些部分在堆栈 被称为堆栈帧。 当你调用另一个函数,主要说 调用一个二进制搜索功能, 我们把另一帧堆栈上。 更具体地说,我们要 捐赠的内存块在我们的 计算机存储二进制搜索的地方 变量和运行的二进制 搜索代码。 所以我们称之为二进制搜索。 在这种大块的内存,我们要 来存储它的局部变量。 我们要存储其printf的调用。 无论发生什么事,该函数是 将被存储在那里。 二进制搜索是要执行。 它要完成执行。 什么是C语言的单词,标志着 一个函数 完成它的执行? 学生:返回。 JASON HIRSCHHORN:返回。 所以每当你看到一个return语句, 函数结束 当它击中了。 所以二进制搜索将达到其返回。 这部分内存基本上会 被释放了。 而主要将回到执行。 所以主要将暂停的地方是,调用 二进制搜索,得到一些返回值, 并继续执行。 这个栈帧会自行消失。 如果我们调用一个递归函数,该函数 是一个函数调用自身在 并且,我们可能会得到 - 我们说 递归做二进制搜索。 我们可能会得到一个二分查找的版本, 二进制搜索二,二分查找 3,二进制搜索4, 二进制搜索五位。 然后这最后的二进制搜索5 将撞击基的情况下,与层叠 帧会回去,并保持关闭 直到我们回到主。 我们可以走了过来递归的一点。 但是,这一切是说,如果你是 调用多种功能的时间, 就会有多个栈 在堆栈帧。 堆,另一方面,升 这里,不是功能, 不为局部变量。 这是动态分配 变量。 因此,这些变量可以是 在任何主要或初始化 函数主要调用。 在任何地方你的代码,它们 可以初始化。 并初始化一个动态 分配的变量。 我们使用什么函数C语言? 学生:malloc的。 JASON HIRSCHHORN:malloc的。 你调用malloc。 你得到的内存空间。 和内存空间 是在堆上。 和内存空间保持 在那里,直到你打电话免费。 在这样动态分配的变量 将堆,只要存在你 希望他们存在,他们不会 走开,直到您明确 告诉他们走开。 你可以在一个函数中创建它们。 该函数的栈 框架会自动消失。 但该变量仍然存在 在堆中,直到它被释放, 可能通过调用该函数 二进制搜索或什么的。 因此,那些堆变量呆在那里 只要你想 他们呆在那里。 而他们得到放在这里。 然后下一个被放在那里。 他们不断得到填补,而他们 呆在那里,直到你调用free。 而且基本上,堆和栈, 让马库斯的问题, 增长向对方。 如果他们碰上彼此,你已经 用完了所有的记忆在你的 电脑,你的程序将退出 因为你没有任何更多的内存 左边使用。 在它们之间,有 可能其他的东西。 但对于本课程的范围,你 不必担心。 所以这就是答案 你的问题。 不用担心这个。 但是,这是长远的答案。 所有你需要知道的是 堆和堆栈 - 一开始在底部。 堆栈一样。 堆是在那里。 他们也会越来越密切彼此。 如果他们碰,这是一个问题。 你耗尽了内存。 但同时,除了知道在哪里 它们是什么被存储在两个 栈和堆。 柯蒂斯。 柯蒂斯:当他们碰撞, 是一个堆栈溢出? JASON HIRSCHHORN:当他们碰撞, 这不是一个堆栈溢出。 堆栈溢出是一个不同的区域 我们可以走了过来,如果你想。 OK,我们会回来,在一个位。 学生:什么叫字 当他们击中对方, 栈和堆? JASON HIRSCHHORN:就目前而言, 不用担心。 只知道 - 我会回答这个问题 下课。 如果他们碰上对方,你跑出来 的内存,因为没有更多的 空间在那里。 学生:对不起,什么是赛格故障? JASON HIRSCHHORN:分部 故障可要求 - 这取决于为什么赛格故障的调用。 有时候,你的堆栈溢出,它会 说赛格故障的错误。 学生:约提领什么 一个空的变量? 那是段错误? JASON HIRSCHHORN:提领 一个空指针 - 好了,如果你有一个指针,你 设置为null,指针,调用, 存储内存地址 作为它们的值。 和一个空指针本质上是 存储0,在第0个 解决该变量。 所以为0x,0,0,0,0,等等。 这0个内存地址,这不是 在我们的画面,那是在那里 在某处,这是保留 对于计算机。 我们没有被允许去触摸它。 所以,当你的程序的执行,如果 事情是试图去记忆 地址0时,它知道 那是一个空值。 它什么都不知道应该在那里。 所以,如果你尝试使用的东西有 并把喜欢的东西或有 试图去那个位置,你是 要得到一个段故障或错误。 这是否回答你的问题? 现在我们就回去 堆栈溢出。 事情在栈中,因为你们有 以前看过,在 - 让我们得出一个接近 一个堆栈帧。 可大家都看到了吗? 因此,我们有我们的堆栈帧。 是在拯救一个数组作为一个地方 变量在该函数。 所以说,我们的阵列有五点。 所有5的那些将被存储 在堆栈帧。 如果我们开始编写超越 这个数组越界 - 因此,如果我们开始写进去, 让我们说这是0。 这些都是五项指标 我们的数组。 如果我们开始编写成指标5,其中 我们没有,当我们有一个 大小为5的数组,我们开始编写成 指标6,7,8,9,我们可以得到一个堆栈 溢出错误。 通常它不是 - 你可能会惹上麻烦 如果你一走了过来。 但是总体来说,您将获得进入 如果你有很多去了最麻烦 和你这么远了,你去写 超过了返回地址 函数,它是位于 栈帧的底部。 因为,对不对? 你 - 在 - 对不起。 不“,因为正确的。” 在栈帧中,你有 你的局部变量。 在堆栈的最底层 帧的返回地址。 这其中的功能 去当它结束了。 如果你覆写回报 地址,那么当这个堆栈帧, 当你正在经历的堆栈 框架和执行的每一行,你 会去你的新的返回地址 这是写的,而不是有 实际之一。 这就是我们如何见过 一些安全漏洞 可以与计算机发生。 所以堆栈溢出,总之,是当 您覆盖的部分在堆栈 你应该使用的地方 变量你应该使用,并 特别是当你开始覆盖 像重要的事情 返回地址。 而这也正是你会得到一个错误。 或者甚至你可以开始 即使写入 - 说二进制搜索是 正上方主。 如果覆盖了很多,你 可以写为主力。 但是总体来说,你以前得到一个错误 然后,由于计算机知道 你正在做的事情你 不应该做的事情。 是啊。 学生:有什么区别 堆栈溢出之间 和缓冲区溢出? JASON HIRSCHHORN:缓冲区溢出 是一个更通用的类型 我刚刚描述。 学生:所以一个堆栈溢出是一种 例如缓冲区溢出。 JASON HIRSCHHORN:没错。 这是一个数组,我们可以认为,作为一个 缓冲,事情进去的空间 这是一个堆栈缓冲区溢出。 我们可以有一个堆缓冲区溢出。 如果有一个缓冲器,它有常 是一个数组堆,而我们 重写了这些界限,那么我们会 有一个堆缓冲区溢出。 和不在本课程的范围, 他们发现有点不同。 编译器有特殊 方法检测各。 但缓冲区溢出是一种更通用的 型我描述的, 这是一个堆栈缓冲区溢出。 这是否回答你的问题? 甜蜜。 有没有什么其他的相关问题 到堆栈或堆? 是啊。 学生:我知道你有免费的字符串 因为他们是在堆 而你不想泄漏内存。 但你必须释放全局变量 和类似的东西? 或者他们会自动释放? JASON HIRSCHHORN:好问题。 所以在CS50.H,我们创建这个东西 你叫一个字符串。 字符串是真的么? 学生:字数明星。 JASON HIRSCHHORN:一个char明星,一个指针 到一个字符,一个指针到 字符数组。 这是该字符串是什么。 因此,我们需要释放它,因为 GetString的,我们用了很多 - 字符串名称等于GetString的 - 这mallocs对我们的一些记忆 堆,然后返回一个指向 那第一个字符 字符串,一个char明星。 所以表面上,如果你还没有 您的任何字符串的自由写作 那你叫到目前为止,你有 被泄露一些内存。 当然,我们还没有谈到 它,所以没有人在得到 对于这样做的麻烦。 但展望未来,是的。 当你调用GetString的,你 mallocing一些空间在堆上。 如果你不打电话免费以后的 字符串,你有内存泄漏。 这回答你的问题? 是啊 学生:所以要做到这一点,我们使用 返回之前免费对不对? 象,范围内的,我想,如果 我们说的一样,INT为主,内 该代码是在那些范围 大括号,右前 - 你知道你会 通常把回报。 你把自由之前? JASON HIRSCHHORN:所以,你可以把免费 无论你想要把自由。 因为这些都是动态分配 变量,因为他们可以 活过一个特定的范围 功能,如果你调用malloc在 独立的功能,例如 GetString的,你可以在主调用free。 你不需要调用它 在所述特定功能 其中调用malloc。 但是,你需要调用它 之前主要的回报。 它实际上取决于。 这要看你为什么malloced的 空间摆在首位。 有些人会打电话 释放很快。 有些人会不叫自由,直到 他们的节目的结束。 而且他们会通过 和自由的一切。 这要看你为什么叫malloc的。 学生:你会说什么 如果你用所谓的GetString? 你会说什么自由? JASON HIRSCHHORN:所以语法免费 简直是免费的,开放的括号,关闭 括号,并且指针的名称。 所以,如果你写的字符串名称等于 GetString的,你把名字在这里。 这就是指针的名称。 它知道来释放内存。 学生:所以,当它释放内存, 指针仍然指向那个地方 在内存中? 或者是指针也走光 它指向的地址。 JASON HIRSCHHORN:我们应该尝试一下。 我们要编写的。 让我们回来的时候,我们得到 编码,并且让代码的。 如果你想找出答案 这一点,你也可以代码 在此期间。 但是,这是一个很大的问题。 学生:有没有可能 免费的东西太快? 所以你仍然需要它为你的程序, 而你释放内存空间? JASON HIRSCHHORN:是的。 这是可能的,如果你免费的东西 然后你再次使用它,你会 碰到一个错误。 但是,这对你,因为你释放 的东西,再后来把它称为。 所以这是一个程序员的失误。 但肯定的。 你可以写。 任何更多的问题 - 是。 学生:所以,如果你都应该只是 释放它一般前 程序结束,是否意味着如果 程序结束,你不释放它, 该内存仍分配呢? JASON HIRSCHHORN:如果你的程序结束 你忘记释放的东西,那么 这整个内存分配 你的程序的生命周期。 当你的程序完全关闭, 该内存是不会 要永远呆在那里。 计算机是足够聪明,知道 该程序关闭时,它 要摆脱所有的内存的那 是与该程序相关联。 不过,也有可以运行的工具 在一个程序来检测,如果当 程序完成后,您忘了 以释放一些内存。 并为你的下一个问题集,其中 您将要使用的malloc和使用 指针,你将要运行此 编写你的程序,如果看到, 当主的回报,你有一些 所剩下未释放的东西。 所以他们不会留malloced 永远留在你的电脑上。 这将是浪费的,因为 很快,电脑 会耗尽内存。 但是,如果他们跑,直到你的结尾 编程和他们不释放,你的 程序退出,这仍然是一个问题 这一工具将帮助您解决。 学生:那是Valgrind的? JASON HIRSCHHORN:这是 所谓Valgrind的。 ,你会 - 学生:但是,我们不必知道 对于测验有关系吗? 我的意思是,有人谈到了 在演讲一点点。 JASON HIRSCHHORN:所以Valgrind的 是,工具的名称。 知道它的作用是 足够的测验。 可是你有没有使用它在您的 问题的设置,因为我们还没有一个 已明确处理问题集 使用malloc或您使用malloc。 所以,你还没有使用Valgrind的呢。 但你迟早会使用它 而不是以后。 学生:你能重复 什么Valgrind是? JASON HIRSCHHORN:对不起? 学生:你能重复 Valgring的目的是什么? JASON HIRSCHHORN:Valgrind的 是名称 - 像GDB可以帮助你调试你的程序, Valgrind的可以帮助你计算出,如果 事情还没有被释放 当你的程序关闭。 所以,你会在你的程序运行它。 和你的程序退出时,它会说 你的程序调用malloc的这么多 时间这么多字节,而你 只有所谓的自由很多次。 所以你离开了这些多少字节 没有被释放。 或者,它会说你已经释放了一切。 干得好。 学生:确定。 它叫做Valgring? JASON HIRSCHHORN:V-A-L-G-R-I-N-D。 学生:关于指针的一个问题。 所以说你有N个明星 x等于什么。 这相当于,不管你把 还有,是什么正在里面放 X是什么指向, 或x的指针? JASON HIRSCHHORN:你能 重复的问题? 我们可以借鉴它,而你说了吗? 学生:在测验,其实, 一个你给我们送来,就好像,烧焦 星级真相等于CS50岩石,对不对? 那么,这是否意味着该CS50岩石 是什么样的真相是指向? JASON HIRSCHHORN:所以你说 大约一个char明星在一个字符串中,如何 的作品? 是啊。 确定。 让我们得出这样的在这里。 [SIDE会话] JASON HIRSCHHORN:所以这个变量 将是char类型的明星。 多大是一个变量 的char类型的明星? 有多少字节? 学生:四。 JASON HIRSCHHORN:这是四个字节。 有多少权利是一个变量 int类型的明星? 学生:四。 JASON HIRSCHHORN:四个字节。 如果它是一个指针,那么它始终是 4个字节,因为指针,其 值是一个存储器地址。 而在CS50内存地址 家电是四个字节长。 因此,当我们需要调用getString,或当我们 也就是说,字符串名称等于,然后在 双引号把一个字符串, 我们正在把 - 好了,这是一个有点不同。 我们会做的GetString为例。 或char星级东西 等于字符串。 对不起,给我的例子 你读? 学生:字符星级等于真相 在双引号“CS50石头”。 JASON HIRSCHHORN:那么这颗星,这 我们将调用这个变量x为 通用的目的。 我们已经创建了一个变量x。 这是char类型的明星。 它是一个指向一个系列 字符。 这样下来在这里 - 因此,这是该会怎样 在内存中运行。 这将存储的存储器地址。 将存储的存储器地址 阵列中的第一个字符。 然后你按照时 指针,你会 得到第一个字符。 如果你正在读这篇东西一样 一个字符串,你的电脑是智能 足以知道,阅读这件事 直到它到达一个反弹0。 但是,如果你正在阅读这一个字符 一时间,所以你通过迭代 这个字符串,那么你将只是一个读 字符一次,直到你到达 反斜杠0。 可能不会回答你的 的问题,虽然。 学生:是啊,但你有没有 malloced的空间 但对于该指针。 JASON HIRSCHHORN:所以我不太清楚 正是你要找什么, 因为我没有作出这样的测验。 这应该是一个有益的 从另一个TF资源。 如果你是在创建一个字符串 堆栈或局部变量,它会 只是数组的费用,而不是 一般一个char星级指向 另一个字符串。 但我不知道。 这可能是一个指向另一个 在堆栈上字符串。 是啊。 学生:我知道你需要 分配内存,如果指针 越来越声明内 另一个函数。 你需要做同样的事情,如果是 主内被宣布, 你使用它的主内? JASON HIRSCHHORN:所以,是的。 你可以声明一个指向任何 在内存中的内存地址。 它可以是一个本地的存储器地址 变,但通常情况下, 人不申报的内存地址 局部变量,因为他们去 一旦离开该函数返回,这 所以我们一般用malloc的东西。 但是,是的,你可以声明一个指针 另一个局部变量。 这只是一般没有这样做。 但是我可以看看那个 下课后具体的事情。 是啊。 学生:我认为这是排序 什么的被问。 它似乎奇怪进行初始化 一个指针而不是作为一个 地址,但正如 似乎是一个值。 这似乎是CS50是里面有什么 事情被指向和 没有实际的地址,对吧? JASON HIRSCHHORN:所以这是 不是这种情况,虽然。 这不是发生了什么。 当你声明一个char星, 这是一个内存地址。 指针是所有的内存地址 指着别的东西。 别的东西可能是在 栈,但几乎总是是在 堆在我们将看到它的使用方式。 但字符串名称等于双引号 “GetString的,”我们可以看到,和我们 可以看看通过和代码。 GetString的字符串没有被保存在 该变量,或任何字符串 名字没有被保存在 变量,因为这不是如何 指针工作。 这是否有道理? 学生:是啊。 JASON HIRSCHHORN:确定。 但愿,这不是 混乱给任何人。 但如果是,我们可以再看看它 在一个位,因为我们实际上会 以代码的东西,希望能 处理字符串的工作和让你感觉 更舒适的他们。 与这些其他问题 主题或其他主题, 我要把备份? 和 - 现在。 是的,奥尔登。 奥尔登:所以这是完全不相关的, 但我们只是去了 真的很快我们所需要知道的 大约32和之间的差 64位机? JASON HIRSCHHORN:是的。 因此,32位是多少字节? 奥尔登:这是四个字节。 JASON HIRSCHHORN:这是四个字节。 和64位是多少字节? 学生:八。 JASON HIRSCHHORN:8个字节。 如此反复,八位为一字节。 您的CS50设备是 一个32位的机器。 因此,内存地址 四字节长。 有2到32个 内存地址。 0到2至32减去1。 而我不是正面的,但是这 什么,你需要大概的范围 知道一个32位的机器,该内存 地址是,再次,四字节长, 这就是最高金额 内存地址。 此外,数据类型 - 这可能是由于东西 那么这是值得注意的。 一个数据类型的大小取决于 您正在使用的机器。 因此,一个字符,一个字符,是怎么 多少个字节我们CS50设备? 一个字节。 它实际上是一个字节作为 以及一个64位的机器上。 和大多数数据类型是相同的数 的字节在两台机器上。 但某些数据类型会有所不同 在两台机器上。 所以这将是可能的 只有你需要知道的事情。 但即使这样,我认为, 超出了界限 - 我几乎可以肯定,如果你回头看 在旧的测验,它说,承担 编码你使用的问题 一个32位的机器。 但也有,一起去,在 如果你有兴趣,有 是相同的数据类型 尺寸上的所有机器。 如果你看过类似的东西 uint32_t的,你可能会或可能 没有看到这一点。 这是一个数据类型。 这是说,有32位不管 什么机器,这是上。 所以,当人们编写可移植 代码,他们可能不会使用int类型。 他们会转而使用其他这些数据 他们知道类型将是相同的 大小每一个机器上。 马杜。 MADHU:我有一个问题是关于 编译过程。 所以,如果你正在编写一个使用程序 像CS50什么的图书馆 这样,我知道该库 有,在某些时候,可 编译和链接英寸 但其中有多少过程中发生 你的程序的编译? 该库程序的哪一部分 当你出现 编译你自己的程序? JASON HIRSCHHORN:让我们去了 通常的步骤这一过程的。 你写你的c文件。 在你的c文件,你的#include你 头的库,例如,cs50.h. 什么是尖锐的,包括 行做你的计划吗? Akchar。 AKCHAR:它增加的原型 从标题中的功能 在库中的文件。 JASON HIRSCHHORN:没错。 它增加了这些函数原型 你的代码。 所以,当你的代码被编译 在早期阶段,编译器知道 这些功能真的存在, 在某个地方,他们已经确定。 h文件不包含 定义这些函数或如何 他们的实际工作。 Cs50.h只是包括一些说 GetString的是一个真正的东西, 可能发生。 和standardio.h说printf的是 一个真实的东西,可以发生。 所以用这个你的c语言实现。头 文件被变成了一些 机器可读的代码,最终 被转换为二进制 代码0和1。 这就是代码,最终 被执行。 使用-l CS50线 - 例如, 当你写锵 - 然后就包括-L CS50, 你键入英寸 你可以看到这一点。 当你写做,你会 看到这条线在这里。 我们将看到,在第二个时 我们的代码或当我们的代码以后。 但这-L CS50线做一些事情 比有点不同 #包括cs50.h. 这是什么-L CS50行吗? 阿维? AVI:我想说的是,它链接 图书馆的功能 打电话,像。o文件。 JASON HIRSCHHORN:所以很 接近,如果不是当场上。 使用-l CS50采用的二进制文件, 与您的二进制文件将其合并。 所以cs50.h,有车削没有点 从C语言cs50.h为二进制每 单一次它被使用。 那将是愚蠢的,因为这 会浪费很多时间。 所以它已经被编译 ,变成一个可执行文件。 现在它要被合并 与您的文件结尾。 因此,那些1和0的打算 与您的那些合并 和0结尾。 所以,现在你会真正有实际 1和0的定义如何GetString的, 例如,工作,还是怎么的printf, 例如,工作。 而对于更多的信息,有一个 总之编译器内特给出了 你应该检查出云 通过这些步骤。 但是 - 是。 学生:他们总是在o文件。 当他们在图书馆的形式, 准备合并,链接 - 像 他们在二进制代码吗? JASON HIRSCHHORN:确定。 什么 - 学生:那是经常的情况下, 该库时将它们链接? JASON HIRSCHHORN:是的。 因此,有。s个文件,这将是 机代码,这也将是 神秘的给你。 你不必担心这些。 但是总体来说,是的,他们会 是。o文件准备好了。 学生:所以,当你运送到 一个库,你只船 的,H和。Ö? 你不出货。c或。秒。 JASON HIRSCHHORN:那么 - 这就是在这短短的为好,如果 这一信息似乎是一个未来 快一点。 但短期的编译器 关于这个谈判也是如此。 当你船库,如果你出货 在H,头文件,这些 函数原型,以及1和 0的,这就是你需要给。 你并不需要给该如何 函数的工作原理,在c文件。 因为该点的抽象,或 点的API,该点在这个SPL, 斯坦福便携图书馆,它的 让你不用担心如何将新 GRect工作,或如何移动工作, 或如何添加工作。 所有你需要知道的是,加 是一个函数,你可以 使用,并且它这样做。 所以,你真的不需要知道如何 它是用C编写的,您只需要 知道,这里是函数,他们 做的,这里是1和0 当你真的想使用它们。 凉爽。 在编译器的任何其他问题 或电路板上的其他议题是什么? 学生:我有一个问题 实现递归函数。 关于递归的一个问题。 我会想出一个感觉。 因此,让我们快速浏览一下 递归与特定 例如,阶乘函数。 因为这是一个例子, 经常出现或使用 来说明递归。 因此,“4!”读作4的阶乘。 又是什么4的阶乘是什么意思? 那是什么呢? 如何计算4的阶乘? 4倍3倍2倍1。 因此,另一种方式来写4的阶乘 就是写这个。 4次3的阶乘。 因为3是阶乘 3倍2倍1。 所以,4次3因子为4 倍3倍2倍1。 这就是为什么阶乘是一个伟大的 候选人递归,因为它是 显然,有一些东西, 发生一遍又一遍又一遍的 更小的一些事情,直到 你到达终点。 当你达到1,1的阶乘为1。 你不能走得更远。 0阶乘也被定义为1。 所以,当你到达1或0,你 在最后,你可以 就回去了。 因此,如果我们想写一个递归 函数来计算阶乘, 我们将编写一些 伪不动了。 在我们写的伪代码 - 我给你们一,两分钟 写的伪代码或者只是想 它 - 有两件事情每 递归函数需要。 什么是这两件事情? 杰克:它调用自身。 JASON HIRSCHHORN:诺亚? 噢,杰克。 来吧。 杰克:它调用自身。 JASON HIRSCHHORN:所以递归 函数需要一个递归调用, 打电话给自己。 这是一。 这有什么其他的事情? 杰克:一个基本情况。 JASON HIRSCHHORN:一个基本情况。 一个基本的情况是,当我们停在这里的。 所以,你的函数被调用。 基本情况是第一位的。 你要知道,如果你在最后。 如果你不是在结束时,你 让你的递归调用。 和你又来了通过这个功能, 再次检查你的基本情况。 如果你还没结束,你做 另一个递归调用, 等等,等等。 这就是为什么递归函数总是 需要这些基础情况和那些 递归调用。 如果你没有一个递归调用,它 不会是一个递归函数。 如果你没有一个基本情况, 如果你想走到永远 不会有什么结局。 和基本情况永远是第一位, 因为你永远要检查 如果你在结束第一。 所以在我们做一些伪代码,为什么 你不花一分钟思考 如何递归阶乘函数 会写的? 此外,多达你在做什么,写 它列于一张纸是 你要什么有 做测验的明天。 所以大概好的做法,使 确保你写的代码 倒在纸上 - 或者你可以做到这一点。 你知道哪里有分号。 你还记得的语法。 因为你不能够有一个 编译器告诉你犯了一个错误。 此外,沿着这些线路,明天,当 您已编码的问题,如果你 都冲了时间,或者如果你是非常 困惑,如何你应该 写特别的事情在C,它 会理所当然你写的伪代码 或写评论为好。 因为有一部份信贷 很多对测验的问题。 所以,你可能操之过急,否则你 可能只是混淆。 写在注释或伪代码 通常的方式,你 可以得到部分分数。 所以,不要留下遗憾 在测验的空白。 有没有处罚 把东西英寸 实际上,投入在伪码或 意见是要帮助的平地机 搞清楚,如果你真的知道什么 你在说什么,或许大奖 你为一些局部的信用。 还沿着这些线路,写清楚。 如果我们真的不能你写的东西, 我们不会给你打电话 在明天午​​夜图 出你写什么。 我们只是要起飞点。 写清楚,以便我们能听到,或者更确切地说, 我们可以读你写的。 如果它说两句话, 不写的一段话。 按照说明进行操作。 写清楚。 写这些意见或 伪代码的问题,可能 奖励部分信贷。 好了,让我们去阶乘。 所以我们有一个函数阶乘。 如果我真正写在C, 我需要什么名字前放 函数? 返回类型,其中,在该 情况下,我们会给它诠释。 然后在大括号内,是 善有善报花括号内为 一个函数? 学生:参数类型。 JASON HIRSCHHORN:它的参数。 所以阶乘大概会 带参数。 它很可能只需要一个参数。 我们会说这会带 一个整数名为x。 再次,写的原型时, 一个功能或记录的功能 在定义它,你在你的代码 写的数据类型和名称 该变量的函数只。 所以,你可以通过一些数字到这个 功能,它会被称为X 在内部。 我们有我们的阶乘函数。 我们需要两个东西,一个基本情况 和递归调用。 是什么样的基本情况进行阶乘? 有人谁写出来谁没有 讲的是,什么是基础 案例阶乘? 学生:如果n小于 大于2,则返回1。 JASON HIRSCHHORN:如果n 小于2,则返回1。 我喜欢这样,因为这 取0和1的照顾。 所以我们会先去做x <2,则返回1。 如果获得通过0,如果我们得到 通过1,此功能将 立即返回1。 如果我们通过一些数量较大的 大于或等于2,我们要 有我们的递归调用。 所以这是怎么去上班? 可别人谁曾在此 谁一直没有发言,给我的 递归调用此函数 在伪代码? 如果我们传递一个数x 而且它大于2,什么 我们想干什么? 我们也有一个例子写在 一面,可能会给你一个提示。 学生:调用x次的 x的减1阶乘? JASON HIRSCHHORN:完全正确。 我们要返回x次 的X减去1的阶乘。 而且,即使我写了, 基本上,你用英语说的话, 这个阶乘函数 将得到再次调用。 这将X减1上执行。 它会返回一些整数, 然后它会乘这两个 在一起,并且该值将是 回到什么叫这个 阶乘函数,这可能 是的另一个实例 这个阶乘函数。 所以这是一个递归的一个例子 功能,一个非常 简单的递归函数。 但他们大多会是这样。 如果你想一个很好的递归 为竞猜挑战,尝试编码 二进制搜索递归。 因为如果你做二进制搜索 问题设定了三个,你可能做到了 反复在一个while循环。 但它也可以写成 递归。 你将需要写你自己的 单独的函数,需要一些 不同的命令行参数 - 或 没有命令行参数,一些 不同的只是普通的论点。 但你可以写二进制搜索 递归地为好。 学生:所以你可能也写, 代替X减1,则 本来也写X减 减号,或者你可以有 书面减减x。 你可以解释得真快,为什么 这些将是不同的东西, 喜欢的区别是什么之间 X减减和减减x? JASON HIRSCHHORN:不,我不 要进入那个。 不过,我以后会和你谈谈这件事 类。 X减,减,减减x 由1减小量X。 但他们这样做有点不同。 但我不想去考虑这样做。 关于递归其他问题 或者这个功能呢? 这不是真的连伪代码。 这基本上是在代码 c您会写这个。 好了,其他问题 的话题在这里? 是啊。 学生:我有一个快速的破败 浮点和精度。 JASON HIRSCHHORN:浮动 点和精度。 可有人真的很快 给我一个破败 浮点和精度? 你都必须做到这一点你 问题集,所以你的所有 熟悉它。 或者,也许不是所有的你。 任何人吗? 给我一个开始的地方。 浮点和精度。 这是什么问题? 是。 维多利亚? 云妮:凡妮莎。 JASON HIRSCHHORN:凡妮莎。 抱歉。 云妮:这里只有有限数量的 可以表示数字 因为你是在,在我们的 情况下,32位的系统。 那种让你不得不 弥补了一些数字。 JASON HIRSCHHORN:所以这是 完全正确。 有仅一定量的 可表示数字。 如果你将两个非常大的数字, 它可能会溢​​出量 的空间,你必须代表 的整数。 这就是为什么有时候我们使用 长,而不是一个int长。 有更多的空间。 可容纳一个更大的数字。 浮点精度,是因为有 这一点,但也有做的 事实是十进制数是 并不总是代表。 抱歉。 让我把这个备份。 十进制数1.0并不总是 代表像你所期望的, 1.000000000。 它有时被表示为 1.000000001或0.999999999。 它可能是89甚至抛出 在那里的某个地方。 因此,这些十进制数字是不 代表酷似你会 希望他们能来表示。 所以在问题设置 - 是两份? - 问题设置两个,在这里我们处理 浮点数,当我们想 他们表示正是我们想要的 他们表示,数 便士,或仙的数量, 我们用100乘以它们。 我们绕过他们。 然后,我们切断了一切 后面的小数点。 这是为了确保他们 实际上等于正是我们想要的 他们相等。 因为当你把东西的 一个float和把它变成一个int,你 切断一切的权利 的小数点。 因为有一些浮点 不精确,100.000可能是 表示为99.999999999。 如果你只是切断了一切 右边向右走,你要 得到错误的号码。 是啊。 学生:我有一个问题 有关转换。 什么为了它发生在? 如果你愿意做浮动,支架,1分 10,它做1除以10, 然后得到0.1,然后打开 它变成一个浮动? JASON HIRSCHHORN:如果你这样做 浮动1除以10 - 学生:是啊,然后等于 - 好了,它通常会 有它在平等的 - 是啊。 你想成为一个浮动,对不对? JASON HIRSCHHORN:好了,我们要 用它来Segue公司进入搞清楚 在这些问题的答案 通过编码。 因为你可能有很多的 这些细微问题,一个很好的方法 解决这些问题是通过编码。 因此,我们现在要编写这一权利, 然后我们要回去 你的代码有问题。 所以第一线 - 我不应该写它 - 什么是 我们要做的第一件事情,当我们 打开gedit中一个新的文件? 学生:包括。 JASON HIRSCHHORN:包括什么? 学生:CS50库。 JASON HIRSCHHORN:确定。 我们还应该包括哪些内容? 我们只是要检查发生了什么 当你施放的东西为float。 但是,我们需要包括,如果我们 打算写一个C程序? 学生:标准I / O。 JASON HIRSCHHORN:stdio.h中。 我们其实并不需要,这 程序,cs50.h,即使它的 总是有帮助的,包括它。 但我们总是需要stdio.h中。 学生:C语言编码什么时候? JASON HIRSCHHORN:在C编码时 所以我将它保存为这个c文件。 我得到了一些不错的语法高亮。 我里面主要写无效。 什么是无效的呢? 学生:不采取任何 命令行参数。 JASON HIRSCHHORN:虚空的手段,在这 情况下,主并没有采取任何 命令行参数。 在其他情况下,表示该功能 并不需要命令行参数。 或者函数,如果我是写无效 主要(无效),这可以说主要的 不返回任何东西。 因此作废只是意味着什么。 我会怎么写,如果我是 采取命令行参数? 学生:诠释圆弧C字符串弧诉 JASON HIRSCHHORN:INT ARGC ARGV字符串。 是这样吗? 学生:这是字符星级argv的括号内。 JASON HIRSCHHORN:所以你可以写 字符串argv的括号或char星级的argv 括号,但你需要的括号内。 因为argv是一个数组 字符串,切记。 这不只是一个字符串。 所以字符串argv是,这里的 一根弦称为argv的。 字符串argv的括号是,这里的 一个字符串数组。 所以整型的argc字符串argv的支架 会是什么,我 可能会写。 所以,你想保存一个整数? 学生:是啊,整数。 或者在浮动。 JASON HIRSCHHORN:在一个浮动? 像,浮x等于1除以10。 JASON HIRSCHHORN:确定。 printf中如何打印出一个浮动? 什么? 学生:%F。 JASON HIRSCHHORN:%F。 什么是整数? d或我。 什么是字符串? 学生:秒。 JASON HIRSCHHORN:秒。 我如何获得一个新行? 学生:反斜杠ñ。 JASON HIRSCHHORN:我该怎么回 如果主要的运行是否正确? 学生:0。 我是否需要写该行有关系吗? 学生: OK,我们不会写它,然后。 每个人都可以读吗? 它看起来有点小。 大家可以看到,还是应该 我使它更大? 我觉得对于摄像头,我们会做 它有点大,虽然。 JASON HIRSCHHORN:如果我想关闭这个 c文件为可执行文件,有什么 我写? 学生:做测试。 JASON HIRSCHHORN:对不起? 学生:做测试。 JASON HIRSCHHORN:请测试。 我们都在谈论 这条线前面。 铛。 什么是铛? 编译器的名称。 这是什么线? 学生:设置它为使用gdb的。 JASON HIRSCHHORN:集 它使用的GDB。 这条线,那是什么? 学生:源代码。 JASON HIRSCHHORN:这就是 源文件,c文件。 什么这两行吗? 或者这两个不是行。 学生:它的名字来测试。 JASON HIRSCHHORN:所以破折号ø说, 不同命名的东西。 在这里,你调用它的测试。 如果我没有在, 那会是什么名字呢? 学生:为a.out。 JASON HIRSCHHORN:为a.out。 这是什么呢? 学生:友情链接数学库。 JASON HIRSCHHORN:它链接 在数学库。 我们没有包括数学库,但 因为这是如此普遍,他们已经 写make来总是包括 数学库。 同样地,这包括 在CS50库。 好了,如果我们列出,我们现在有 可执行文件名为test。 为了执行它,我写的测试。 我看到我的浮点运算, 正如所料,等于0。 这是否 - 所以 - 学生:那么,如果你把现在浮动, 就像你将其转换为浮动 - JASON HIRSCHHORN:铸铁 1为float? 学生:不,投满的事情 - 是的。 如果你只是这样做,会 这使它0.1? JASON HIRSCHHORN:好了,真的很快, 1除以10,这些都是 整数被分割。 所以,当你划分整数,​​它们是 0,而你节省了0的 浮动,因为斜线 只是整数除法。 所以,现在我们正在转弯的东西 成浮动。 让我们看看会发生什么。 我们会让测试。 所以,现在我们看到的斜线不 整数除法,它是浮动的 分点。 因为它的参数之一 已被转换为一个浮点数。 所以,现在有人说,对待这个 师像我们正在处理 浮动点,不带整数。 所以我们得到我们期望的答案。 让我们看看会发生什么 - 哎呀。 如果我想打印更十进制 点,我怎么能这样做呢? 学生:点圆点f或尽可能多的 只要你想的小数位数。 JASON HIRSCHHORN:所以我打印 10进制的斑点。 而我们现在看到我们越来越 一些怪异的东西。 而这又回到你的问题 关于浮点不精确。 有奇怪的东西存放在这里。 好了,这是否回答你的问题? 你想要什么 快速代码? 学生:我只是想看看是否 不,如果你释放了一些指针, 该指针是否仍然存储在 它是什么它一直是地址 指着前面。 JASON HIRSCHHORN:OK, 所以让我们做到这一点。 字符明星PTR,这将创建一个变量 所谓PTR char类型的明星。 我怎样写的malloc? 奥尔登? 奥尔登:只是malloc的。 但随后它必须的尺寸,并 在这种情况下,我想你会 是指向字符。 所以它会是char。 JASON HIRSCHHORN:OK,所以更 一般地,内幕 - 让我们编辑。 里面的malloc,你要的号码 字节的堆。 一般情况下,我们所看到的,我们是 做的是我们要去用malloc 字符串,例如,或 整数的数组。 因此,如果我们想要10的整数,或10 字符,10会给我们10。 然后字符的大小会给 我们说,字符大小,这在 这种情况下,是1个字节。 我们得到了10个字节。 如果我们写为int的大小, 这会给我们40字节。 所以更一般地,malloc的内部 是你想要的字节数。 在这种情况下,我们得到1个字节。 这似乎是一个奇怪的运用 malloc的,但对于我们的 目的是有道理的。 因此,有一点。 我们要调用free。 我们摆脱它,我们再次使用PTR。 和你想要什么检查? 学生:我只是想检查是否 或不存在是什么, 里面的它。 JASON HIRSCHHORN:所以,无论 它指出了什么? 学生:是的,没错,无论是 它仍然有一个存储器地址。 JASON HIRSCHHORN:所以,你想要 检查ptr的值? 学生:是的,没错。 JASON HIRSCHHORN:那我写在这里 如果我要检查的价值 点 - 什么是,乔丹 说,值? 或者什么是存储PTR里面? 学生:一个内存地址。 JASON HIRSCHHORN:一个内存地址。 所以,如果我写的只是这一点,它会 给我ptr的值。 以及如何打印出 一个内存地址? 什么是格式字符串 用于存储器的地址? 学生:%P。 JASON HIRSCHHORN:%P。 %s是一个字符串。 %P的指针。 是这样吗? 这是正确的。 所以PTR等于 - 但仍然有一些东西在里面。 这可能是一个更 有趣的问题。 这是什么线路呢? 学生:赛格故障。 JASON HIRSCHHORN:什么? 学生:我觉得这赛格故障。 JASON HIRSCHHORN:嗯? 学生:我认为它会赛格故障。 JASON HIRSCHHORN:所以这条线 的代码,明星PTR,是什么 没有星星是什么意思? 学生:内容。 JASON HIRSCHHORN:是啊。 去得到的内容。 因此,这是要去记忆 有地址,并让我说。 我用%C就在这里,因为有 存储有字符。 因此,我们打算去那个地址我们 刚看到 - 或者它可能会成为一个 稍微有点不同,这 一次,我们运行该程序。 但我们会去那个地址 我们知道仍然存在 看看那里的东西。 所以也没赛格故障。 它只是没有给我们任何东西。 它可能实际上已经给了我们 东西,我们不能看到它。 而这又回到这个想法 - 并且我们不会得到太多到 这一点,因为这是超越 本课程的范围。 但我们谈到这里吧,如果我们 超出了数组界限由 1,我们可能不会惹上麻烦。 有时候,当你只是1熄灭, 你正在做的事情错了,你 可能惹上麻烦。 但你并不总是惹上麻烦。 这要看怎么是一件坏事,你得多 这样做,你会惹上麻烦。 这是不是说,马虎 与您的代码。 但它说,该计划将不会 总是跳槽,即使你去的地方 你不应该去。 这方面的一个很好的例子是,很多 人们在问题设置3,其中 15岁,没有检查 董事会的界限。 所以,你看左边,看向 右,看着顶端,看着 至底部。 但你没有检查,看看是否顶部 实际上将是在黑板上。 和很多人谁这样做了, 原来,在,他们的工作程序 完美,因为那个地方是板 存储在内存中,如果你走了一条 它上面或托运的记忆 地址,有没有什么 尤其可怕的这个, 所以你的程序是不是 要骂你。 但是,我们仍然起飞点,如果 你没有检查,因为你 在做一些你不 应该做的,而你可以有 变得麻烦了。 奇怪的是,虽然你可能没有。 因此,这是证明,是的, 我们仍然可以去它。 而我们没有得到的 在这种情况下,麻烦。 如果我们试图做阅读 接下来的100个字,我们就 可能惹上麻烦。 而且你可以编写读取下一个100 字符,如果你想要做一些 排序的for循环。 是啊。 学生:因为我们被分配了 空间的实际值,我们不会 居然能看到什么。 我们是否应该尝试用该设置 等于像C什么的? JASON HIRSCHHORN:大问题。 我如何设置该值 - 我写行哪一行代码 七,你说什么? 学生:星PTR等于单 引用C + +期末单引号。 JASON HIRSCHHORN:所以这把 一个字符,C,在该位置, 因为再次,这颗恒星 意味着去那里。 和左手侧使用时 赋值运算符,等于 签名,我们不会得到那个 值这么多的设置值。 现在,让我们看看会发生什么。 我们把那里的东西 并且它在那里。 我们所谓的自由。 有些东西可能发生 在堆上。 因此,它不存在了。 但同样,我们没有得到 在为去那里的麻烦。 我这样做出来的代码来说明 有很多这些 您有任何问题,他们是 真的很有趣 回答了很多时间。 而且他们真的很好的问题。 并且你可以计算出来的 自己如果,例如, 我们不是在一节。 是啊。 学生:因为你没有送 指针的任何地方,你需要 使用malloc? JASON HIRSCHHORN:所以这可以追溯到 给你最初的问题。 [? ?] 难道仅仅是一个局部变量? 这里的malloc是不是引人注目。 在使用malloc这里就不 那引人注目,因为它是 只是一个局部变量。 学生:所以你能做到的char 明星PTR等于你好? JASON HIRSCHHORN:哦。 所以,我们要拿回 给你最初的问题。 我觉得你不满意 我的回答。 好不好? 喜欢吗? 学生:是啊。 等待。 JASON HIRSCHHORN:在哪里 你想打印出来? 因此,我们将打印出一个这样的字符串? 学生:有趣。 JASON HIRSCHHORN:所以这个说,这 参数有一个字符的类型。 所以这应该是一个字符。 学生:只需要第一个。 JASON HIRSCHHORN:所以这 就是我之前说的。 就像我说的,它不是存储 字符串变量的指针里面。 它的存储 - 学生:第一个值 的字符串。 JASON HIRSCHHORN:的地址 字符串的第一个值。 如果我们要打印出这一点,我们 进入内部指针的值。 我们会看到它确实是, 的存储器地址。 这是否有道理? 抱歉。 等等,这是否回答你 问题有关系吗? 学生:是啊。 JASON HIRSCHHORN:这行代码是 创建一个字符串,然后再 变量指针的指向 该字符串,数组。 是啊。 学生:所以,如果我们去一个内存 进一步解决,我们将得到的H? 有没有被存储为一个字符串? JASON HIRSCHHORN:像我们所做的 - 所以这是有价值的事情。 这是第一点运算,这你们 以前见过,应该是 比较舒服。 这类似于写 - 如果我们写这行代码, 我们以前见过数组符号。 这应该给我们的第二个 在这个数组,H值。 如果我们这样做,这也应该给 我们在该数组的第二个值。 因为它是将不向存储器 的第一件事地址,但 的事情之一,在内存地址。 然后恒星取消引用运算符 该指针。 再次,让我们来看看。 我们再次拿到小时。 学生:这到底是什么 解引用是什么意思? JASON HIRSCHHORN:取消引用 是看中字去。 去那个并获得那里的东西 是取消引用指针。 这只是一个花哨的字的。 学生:如果我们想打印 整个字符串,我们可以 做符号指针? JASON HIRSCHHORN:OK,我们都 要在这里暂停。 我们将在这里结束。 符号给你一个地址 位置,所以你做的时候符号 一个变量,它给你的地址 其中的变量存储。 符号指针会给你 PTR其中ptr是在内存中的地址。 我们不会去 用这个例子。 你能弄清楚这些 自己的东西。 但是,这甚至可能是一个濒临 超越你需要知道的一点 这次中期的范围 - 或本测验,而。 抱歉。 我们要继续前进,因为我会 喜欢做一个编码问题 之前的时间到了。 而我们将要编写什么,我认为 是目前最引人注目的这些 例子,atoi的。 所以这是一个问题 测验两年前。 我有它的董事会这里。 人们被要求在测验 - 他们得到多一点tesxt在 的问题,但我消灭了 文本,因为它是不必要的 我们的目的了。 这只是一些背景 什么是atoi一样。 但大家都知道,是非常 熟悉的atoi。 我建议你​​这个代码 上一张纸。 我也建议你使用策略 我们已经讨论了 很多在我们的一节。 首先,确保你理解 什么是atoi的做。 画一幅画或想出一些 它在你的脑袋的精神形象。 接下来,写出伪代码这一点。 在测验,如果你得到的是 伪代码,至少你 装上去了下来。 然后是伪代码映射到 C.如果你有一个检查在你的 伪代码,就像检查什么 是1,即映射到如果一个 条件等等。 最后,代码在C程序 所以回去的atoi和需要五分钟 编写本上的纸 纸,这可能是关于 的时候,你会采取一个量 测验代码atoi的。 5至15分钟,5至12个,5到 10分钟后,大约的量 时间你会在这上面花 问题的问答。 因此,需要五分钟的话,请。 如果您有任何问题,提高 你的手,我会回到你身边。 [私下交谈] JASON HIRSCHHORN:好了, 那是五分钟。 这是大概的金额 你最好花了一个测验, 那个时候,也许低端。 我们将回顾一下在一个位。 让我们开始编码了。 如果我们没有得到,一路过关斩将, 的答案,这个和这个 测验问题的情况下,再一次, 2011年秋季是当这个问题 出现在测验。 而这是值得八个点 在测验即可。 八个点是对的高端 点的东西量是值得的。 大多数问题都在范围内 一到六个点。 所以这是一个更具挑战性 问题是肯定的。 谁能让我开始? 一般情况下,究竟是为了什么 要想做这个 函数atoi,逻辑? 我们究竟想干什么? 所以我们要编写 一些伪代码。 学生:转换字符 成整数。 JASON HIRSCHHORN:转换字符 成整数。 确定。 那么多少个字,我们都 将需要办理什么手续? 学生:他们全部。 学生:所有人物 在字符串中。 JASON HIRSCHHORN:所有 字符的字符串。 因此,如果我们想要去通过每一个 字符的字符串,是什么东西 C语言,我们已经看到,已经允许 我们走过的每 字符在一个字符串? 学生:一个for循环。 JASON HIRSCHHORN:一个for循环。 因此,我们通过将循环 每个字符s中。 那么什么是我们要想做 当我们得到一个特定的字符? 说我们就要过去了90。 我们得到了9。 这是一个字符。 什么是我们想要做的 该字符9? 学生:从字符0中减去了吗? 学生:加0? JASON HIRSCHHORN:减去 它从字符0? 学生:是啊。 JASON HIRSCHHORN:为什么 你想这样做? 学生:[听不清] 值。 它的int值。 JASON HIRSCHHORN:好了,我们走 字符9,从它减去 字符0得到一个 实际整数9。 甜蜜。 你怎么知道字符 9负0字符是9? 你看什么图? 学生:有逻辑上9 在9和0的地方。 或者你可以看一下ASCII表。 JASON HIRSCHHORN:ASCII表。 但是,是的,你是正确的为好。 所以我们减去0。 所以,现在我们有整数9。 什么我们想要做的是什么? 如果我们有90,它是一个整数 我们,就是我们想干什么? 学生:我把一个临时整数 数组,然后做数学吧 后来将它做成了尽头。 JASON HIRSCHHORN:确定。 学生:您可以开始在年底 该数组,然后向前移动,以便 你往前走每一次, 你乘以10。 JASON HIRSCHHORN:确定。 这听起来像一个漂亮的 引人注目的想法。 我们可以在我们的数组的末尾开始, 而且我们可以使用strleng。 我们可以在这里使用strleng。 我们会得到我们的字符串的长度。 首先,我们在最后。 和+第一位的,我们只取了 整数,也许我们创建一个像 新的整型变量往上顶,其中 我们要存储的一切。 因此,我们通过以s每个字符从环 回到前面,我们减去0, 然后我们把它,并根据 它在哪里,我们乘它 以10的幂。 因为第一个,我们怎么办 乘以最右边的字符? 学生:10到0。 JASON HIRSCHHORN:10到0。 什么是我们乘第二 最右边的字符通过? 学生:[听不清]。 JASON HIRSCHHORN:什么? 学生:10到1。 JASON HIRSCHHORN:10到1。 第三,最右边的字符? 学生:10到2。 杰森HIRSCHHORN:10至2。 学生:对不起,我不明白 我们在这里做的。 JASON HIRSCHHORN:OK, 让我们回去,然后。 所以,我们要得到 传递的字符串。 因为我们正在写的atoi。 所以我们得到传递的字符串。 说,我们正在获得通过 在串90。 我们要做的第一件事就是设置 一个新的整型变量,我们是 只是要创建 作为我们新的整数。 这就是我们要去 返回在最后。 我们需要经过每一个字符 的字符串,因为我们已经确定 我们需要触摸每一个和 然后将其添加到我们的新的整数。 但是,我们不能仅仅将其作为一个数字。 我们不能只取9和 新增9对我们的整数。 这要看是什么地方 它是字符串中。 我们将需要乘 它由10的幂。 因为那是基地10件作品。 所以,我们要获得实际的 字符,或实际整数 数,减去字符0 从9字就像我们一样 从减去字符大写A 任何性质我们在一 这些问题。 因此,我们将真正得到一个从0到 9保存为一个实数,我们将 由10根据功率乘以 在我们所处的字符串中。 然后我们将其添加​​回 成我们新的整型变量。 那么,这看起来就像会 可以 - 我们将绘制在这里。 如果我们传递的字符串90 - 学生:[听不清]。 JASON HIRSCHHORN:但 atoi的接受一个字符串。 因此,我们要经过 的控股。 我们会获得通过的90。 我们去从后面到前面。 我们以0。 学生:我很抱歉。 也许这是愚蠢的。 如果我们得到传入一个字符串, 为什么是90我们在做什么 获得通过的? 因为90是一个整数。 JASON HIRSCHHORN:因为atoi的需要 字符串,并把它变成整数 该字符串表示形式。 但是字符串90不是整数 90或90位。 串90是两个阵列,或 三个大字,相反,9 字符,字符0,和 反斜杠字符0。 我们正在写的atoi,因为, 例如,当你把命令 行参数,并且它保存在 argv的,它保存为一个字符串。 但是如果你想将其视为一个数字, 您需要将其转换为 实际的整数。 我们做了我们的问题集之一。 我们在一些做 我们的习题集。 大家,把一个整数 作为命令行参数。 所以这就是为什么我们的atoi函数 接受一个字符串。 所以,再一次,在这里我们的例子中,我们 要采取最后一个。 我们要减去字符 0从它,因为字符0 减去字符0给你 的实际数目为0,根据 ASCII码的数学,我们做的。 因为字符被表示为 不同于他们的实际 - 的 一个字符,例如 小写字母a为97。 这不是 - 糟糕! 这不是任何你所期望的 它是,例如0。 所以,你必须减去 字符得到0。 所以,我们要做的是,这里 得到的实际数量。 然后我们将通过乘以它 10的幂取决于它 是在字符串中,然后采取 并把它添加到我们的占位符 变量,所以我们可以拿出 我们最终的新的整数。 这是否有道理给大家? 因此,我们不打算这个代码 现在,因为我们 越来越短的时间。 我的,何时道歉。 但是,这是什么,希望你会 能够做的测验 - 在 最起码,得到这个伪代码 写出来。 然后,如果我们写的 伪代码,实际上,我们可以这样做 很快。 注释每一行我们我们写 在这里转化为约 一行C代码。 声明一个新的变量,写作 一个循环中,一些减法,一些 乘法和一些分配。 我们可能还需要 写一个返回行。 我们可能还需要放 一些检查在这里。 是啊。 学生:所以我们可以把 S作为实际的字符串? 因为我知道这只是一个地址。 就像,你会怎么得到的长度 该字符串被通过? JASON HIRSCHHORN:那么,如何做 字符串的长度是多少? strlen的。 学生:strlen的,是的。 不过你能不能把S作为 论点是什么? JASON HIRSCHHORN:所以strlen的 需要一个char明星。 接下去就是字符明星,它 保持计数,直到它到达一个 反斜杠0。 strlen的竟是 其他项目之一,我们 将要的代码。 这是另一个很好的一个代码。 一个人的更容易一点,因为如果 你要想想, 概念 - 我只是说出来大声 - strlen的如下 一个指针,并保持持续和 计数和跟踪,直到 你达到一个反斜杠0。 学生:好的,知道了。 JASON HIRSCHHORN:所以最好的 运气测验0的明天。 如果您有任何问题,我会 在此之后在外面。 请随时给我发电子邮件。 伸出自己的TF,如果你 不是在我的部分,或者让我 如果你想通过电子邮件发送。 如果你想发飙了,只是发送 我一个电子邮件,一个FREAKOUT电子邮件,我会 送你回去,像一个笑脸, 还是一样,开个玩笑什么的。 可以随意做,也是如此。 祝你好运再次,我会 见到大家下周。