>> 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电子邮件，我会
送你回去，像一个笑脸， 还是一样，开个玩笑什么的。
可以随意做，也是如此。
祝你好运再次，我会 见到大家下周。