[音乐播放] DOUG LLOYD:指针,我们在这里。 这可能会 是最困难的话题 我们在这里讨论的CS50。 如果你读过 关于指针什么 之前,你可能会有点 恐吓进入这部影片。 这是真的指针 不要让你的能力 到也许搞砸了 当你很厉害 与变量和数据的工作, 并导致程序崩溃。 但他们实际上是非常有用的 他们让我们一个真正伟大的方式 通过数据备份和 第四功能之间, 我们是否则无法做到。 还等什么,我们真的 想在这里做的是火车 你有很好的指针纪律,所以 你可以有效地使用指针 让你的程序要好得多。 正如我所说的三分球给我们一个不同的 办法函数之间传递数据。 现在,如果你还记得 较早的视频,当 我们谈论 变量的作用域,我提到 所有我们传递的数据 在C函数是按值传递。 我可能没有使用的 看,我的意思有 是我们传递数据的副本。 当我们通过一个变量的函数, 我们没有真正传递变量 的功能,对不对? 我们传递的一个副本 该数据的功能。 该函数做的事情会 并计算出一定的价值, 也许大家使用该值 当它给它回来。 有一个例外 这条规则按值传递的, 我们会回来的是什么 有一点后来在这部影片。 如果我们用指针来代替 使用变量的, 或者使用替代的变量 本身或变量的副本, 我们现在可以通过周围的变量 之间以不同的方式的功能。 这意味着,如果我们使 在一种功能的变化, 这一变化实际上会 在不同的功能的影响。 再次,这是一件 我们以前无法做到, 如果你曾经尝试交换 在函数两个变量的值, 你已经注意到了这个问题 排序攀升,对不对? 如果我们想交换的X和Y,和我们 他们通过一个叫交换功能, 该函数内部交换 变量做交换价值。 一变二,二变 ,但我们实际上并不 在原有的任何改变 功能,在呼叫者。 因为我们不能,我们只 与他们一起工作的副本。 随着指针虽然,我们可以 实际上通过X和Y的一个函数。 这个函数可以做 一些与他们。 而那些变量的值 其实可以改变。 所以这是在相当长的变化 我们处理数据的能力。 在我们深入 三分球,我认为这是值得 花几分钟到 回到基础在这里。 同时你也可以看看如何 计算机存储作品 因为这两个科目会 实际上是非常相关的。 正如你可能知道, 您的计算机系统 你有一个硬盘驱动器或 也许是固态硬盘, 某种形式的文件存储位置。 它通常某处 250千兆字节附近 也许到了几个TB的现在。 而这也正是所有的 文件最终活, 即使您的计算机关闭 关闭,你可以将其重新打开 你会发现你的文件存在 再次当您重新启动您的系统。 但是磁盘驱动器,像一个硬盘驱动器, 一个硬盘驱动器或固态硬盘,固态硬盘, 只是存储空间。 我们实际上不能做任何与 该数据是在硬盘, 或固态驱动器。 为了真正改变 数据或移动它, 我们必须把它移到 RAM的随机存取存储器。 现在RAM,你有很多 少在您的计算机。 您可能有某处 512兆附近 如果你有一个旧的电脑, 到也许两个,四个,八个,十六 甚至可能是一点点 此外,4GB的内存。 所以这是非常小,但是这 其中所有的易失性数据的存在。 这就是我们可以改变的事情。 但是,当我们把自己的电脑关闭, 所有在RAM中的数据被破坏。 所以这就是为什么我们需要硬盘 对于它的更稳定的位置, 这样它exists-它会 是真的不好,如果我们每次都 把我们的电脑关闭,每 在我们的系统文件被抹杀。 因此,我们的RAM里面工作。 而每一次,我们正在谈论的 内存,相当多,在CS50, 我们谈论的RAM,而不是硬盘。 所以,当我们搬东西到内存中, 它占用一定的空间。 所有的数据类型的 我们一直在与 采取了不同的 量的RAM空间。 所以,每次创建一个整数 可变的,四个字节的存储器 被搁置在RAM中,所以你 可以与整数工作。 可以声明整数, 改变它,为它分配 一个值10增加 由一个,等等等等。 所有需要发生在 RAM,你会得到四个字节 一起工作的每一个 整数创建的。 每个字符您 创建得到一个字节。 这就是空间到底有多少是 存储一个字符需要的。 每个浮动,一个真正的 数,得到四个字节 除非它是一个双 精度浮点 号,它可以让你 有更精确或多个数字 小数点后 又不失精确, 它占用八个字节的内存。 长期多头,真正的大整数, 还占用八个字节的内存。 有多少字节的内存 做字符串占用? 好吧,让我们把一根钢钉这个问题 现在,但我们会回来的。 所以回到这一想法的内存 字节大小的单元的大数组。 这真的是这样,它的 只是一个巨大的数组细胞, 就像任何其他的阵列 你熟悉和观望, 除了每一个元素是一个字节宽。 就如同一个数组, 每个单元都有一个地址。 数组中的每个元素 有索引,并且我们 可以使用该索引做所谓的 阵列上随机接入。 我们没有开始在 数组的开始, 遍历每个 其单个元件 找到我们所要寻找的。 我们只能说,我想要得到的 第十五元件或100元件。 而且你可以通过该号码 并得到你要寻找的价值。 同样每一个位置 在存储器都有一个地址。 所以,你的记忆可能 是这个样子。 这里是一个非常小的大块 存储器,这是20个字节的存储器。 前20个字节,因为我 地址有在底部 是0,1,2,3,依此 在一路攀升至19。 而当我宣布变量, 当我开始与他们合作, 该系统将要设置 我预留一些空间 在该存储器中的工作 我的变量。 所以我可以说,炭c等于资本 H.什么事情发生? 那么该系统会 抛开对我来说一个字节。 在这种情况下,它选择字节数目 四,在涉及到四个字节, 并且它要保存 在信中有大写的H我。 如果我那么说INT速度 极限等于65,这是 要预留4 记忆对我来说字节。 它是怎么回事治疗那些 四个字节作为一个单位 因为我们正在努力 用在这里是一个整数。 而且它要存储65在里面。 现在已经我有点 告诉你有点骗人的, 对的,因为我们知道, 计算机二进制工作。 他们不明白 一定就是一个大写的H是 或者什么是65,他们只 懂二进制,零和的。 所以实际上是什么 我们要存储在那里 是不是字母H和65号, 而是二进制表示法 物,它看起来 有点这样的事情。 并且特别是在 整型变量的情况下, 它不会只是吐了进去, 它不会把它当作四位一体 字节块必然, 它实际上是 把它当作四分之一的字节块, 这可能会是这个样子。 即使这不是 完全正确要么, 因为一种叫 字节排列顺序,这我们不 要进入了,但 如果你好奇, 你可以少读了 与大字节序。 但为了这个说法, 为了这个视频, 让我们姑且认为,在 事实上,如何在65号会 在代表 每个内存的系统上, 尽管这不是完全正确的。 但是,让我们实际上只是获得 去掉所有的二进制完全, 而只是想想为:H 65,这是一个容易得多 想想它像 ,作为一个人。 好吧,所以它似乎也可能是 有点乱了I've-我的系统 没给我个字节5,6,7, 和图8来存储整数。 还有一个理由,同样,这 我们不会进入的权利,但足够了 我要说的是什么 计算机在这里做什么 可能是它的一部分,一个很好的举措。 给不给我的内存是 一定背靠背。 虽然它现在打算怎么办呢 如果我想获得另一个字符串, 所谓的姓,我想 把劳合社在那里。 我将需要添加1 性格,那每个字母的 将需要一个 字符,存储器的一个字节。 所以,如果我可以把劳合社进入我的数组 这样的我很不好走,对不对? 缺少了什么? 请记住,每一个字符串我们的工作 用C语言结尾反斜杠零, 我们不能忽略,在这里,无论是。 我们需要预留一个字节 内存来保存,所以我们 知道什么时候我们的字符串已经结束。 所以,再一次这样的安排 事物的方式 出现在内存中的威力 有点乱, 但它实际上是多么的 大多数系统的设计。 要它们对齐的倍数 四,原因再次 我们并不需要 进入现在。 不过这一点,所以我只想说的 这三行代码后, 这是记忆是什么样子。 如果我需要的存储位置 4,8,和12来保存我的数据, 这是我的记忆是什么样子。 而就特别 迂腐这里,当 我们谈论的记忆 地址我们通常 这样做使用十六进制符号。 那么,我们为什么不把所有这些 从十进制转换为十六进制 只是因为这是一般 我们如何参考存储器。 因此,而不是为0〜 19,我们有什么是零 x零到零X1三种。 这些是20个字节的内存,我们 也或者我们正在寻找在这个图片 就在这儿。 因此,所有的他这样说,让我们 从内存一步之遥了第二 和背部的指针。 这里最重要的 事情要记住 当我们开始与指针的工作。 指针是什么 不是一个地址了。 我会再次因为说出来 它是那么重要, 一个指针是什么 不是一个地址了。 指针是地址位置 在内存中的变量住。 知道它有望成为一个 稍微容易一些与他们合作。 另一件事我喜欢 这样做是有排序 的图表直观代表什么 发生与各行的代码。 我们会做这样的夫妻 在指针的时候, 当我们谈论动态 内存分配也是如此。 因为我认为,这些图 可以是特别有帮助。 所以,如果我说,例如,时int k 在我的代码,发生了什么事? 那么什么是主要发生在 我得到的内存预留给了我, 但我甚至不喜欢 想想这样的,我 喜欢去想它像一个盒子。 我有一个盒子,它的 颜色为绿色,因为我 可以把整数绿框。 如果这是一个角色,我 可能有一个蓝色的盒子。 但是,我总是说,如果我创建 一箱,可容纳整数 该框为绿色。 我拿一个永久性标记 而我写钾对的这一边。 所以,我有一个盒子叫做K, 到了我可以把整数。 所以当我说INT K,这是 在我的脑海会发生什么。 如果我说k等于五,我在做什么? 好吧,我把5 在框中,正确的。 这是非常简单的,如果 我说INT K,创建一个盒子叫做K。 如果我说k等于5, 投入五成箱。 我希望这不是一个太大的飞跃。 这就是事情走 有趣的一点,虽然。 如果我说INT * PK,以及即使我不 知道这必然意味着, 这显然​​是得到的东西 做的整数。 所以,我要色 这个盒子的绿色十岁上下, 我知道它有什么 做的整数, 但它不是一个整数本身, 因为它是一个int明星。 有一些稍微 不同吧。 因此,一个整数的参与, 但除此之外,它的 从没有太多不同 我们都在谈论。 这是一个盒子,它有一个标签, 它穿着标签PK, 而且它能够容纳 INT明星,不管那些。 他们有事可做 与整数,清晰。 这里的最后一行,虽然。 如果我说PK =​​&K,哇, 刚刚发生了什么,对不对? 所以这个随机数,看似随意 数,被扔进了箱子那里。 所有也就是说,是峰 得到k的地址。 所以我会继续其中k内存里, 其地址,其字节的地址。 我做的是我的话 该值就是我要去 把我的箱子叫做PK的内部。 而且,由于这些东西都是 指针,因为找 在像无×字符串 八零Ç7四八 两个零可能 意义不大。 当我们通常想象的指针, 我们实际上这样做的指针。 PK给我们的信息 我们需要找到K的内存。 因此,基本上峰中有一个箭头。 如果我们走的长度 那个箭头,想象 这件事情,你可以走,如果我们 沿箭头的长度行走, 在该箭头的最前端,我们 会发现在存储器中的位置 其中k生活。 这真的很重要 因为一旦我们知道其中k生活, 我们可以开始与数据进行工作 里面的内存位置。 虽然我们得到的蝇头 有点超前了现在。 那么,什么是指针? 指针是它的一个数据项 值是一个存储器地址。 这是零个八零的东西 怎么回事,这是一个内存地址。 那是在存储器中的位置。 和指针的类型 描述的那种 数据,你会发现在 该存储器地址。 因此,有整型明星的部分权利。 如果我按照箭头,它的 要带领我的位置。 而那个位置,我 会发现有在我的例子, 是一个绿色的盒子。 这是一个整数,这就是我 会发现如果我去这个地址。 的数据类型 指针描述了 你会发现在这个内存地址。 因此,这里的很酷的事情虽然。 指针允许我们传递 功能之间的变量。 而实际上传递变量 而不是通过他们的副本。 因为如果我们确切地知道在哪里 在存储器找到的变量, 我们并不需要作出的副本 它,我们可以去到那个位置 和与该可变工作。 因此,在本质指针排序 做出一个计算机环境 很多更像是真正的世界吧。 因此,这里是一个比喻。 比方说,我有一个笔记本, 对了,这是充满了笔记。 我希望你能更新。 你是一个函数, 更新注意事项,正确的。 在路上,我们一直 到目前为止的工​​作,有什么 偏偏是你将采取我的笔记本, 你会去到复印店, 你会做的影印件 笔记本的每一页。 你会离开我的笔记本背 我的办公桌上时,你就大功告成了, 你会去交掉的东西在我的 笔记本电脑,过时或错误的, 然后你就会传回 我施乐页堆叠 这是我的笔记本电脑与副本 你做了它的变化。 在这一点上,它给我, 调用函数,作为呼叫者, 决定把你的笔记和 它们整合回我的笔记本电脑。 因此,有很多步骤 这里涉及到了吧。 就像那岂不是更好 如果我只是说,哎,你 更新我的笔记本 我,交给你我的笔记本, 你拿的东西, 从字面上跨出来 并更新我的笔记在我的笔记本。 然后给我我的笔记本电脑了。 这是什么样的 指针允许我们这样做, 他们做出这样的环境中有很多 更像是我们如何运作的现实。 所有这样的权利是什么 一个指针,让我们来谈谈 关于指针在C中是如何工作的,并 我们如何开始与他们合作。 所以这是一个非常简单的指针 称为C中的空指针。 空指针指向什么。 这可能看起来像它的 其实不是一个非常有用的东西, 但正如我们将看到一个 过了一会儿上,其实 这个空指针存在 居然真的能派上用场。 每当你创建一个指针, 你不将其值设置立即─ 设置的一个例子 其价值立即 将一对夫妇滑回 在这里我说的PK等于&K, PK获得K公司的地址, 我们将看到这意味着什么, 我们将看到如何编码的shortly- 如果我们不将其值设置为某事 马上有意义的, 你应该总是 设置你的指针指向空。 你应该把它设置为指向什么。 这比很大的不同 正要离开的价值,因为它是 然后声明 指针,只是假设 这是零,因为那是很少如此。 所以,你应该总是设置 一个指针的值 为空,如果你不将其值设置 立即有意义的事。 您可以检查是否指针的值 为null使用等于运算符 (==),就像你比较任意整数 值或使用字符值(= =) 为好。 这是一种特殊的恒 值,你可以用它来测试。 所以这是一个非常简单的 指针,空指针。 另一种方式来创建 一个指针是提取 一个变量的地址 你已经创建, 而你做到这一点使用的& 运营商地址提取。 对此我们已经先前看到的 在第一个图的例子我发现。 因此,如果x是,我们的变量 已创建的整数类型, 然后&x是一个指向一个整数。 &X是 - 记住,和将要提取 的右边的事情的地址。 并且由于一个指针只是一个地址, 比&x是一个指向整数 它的值就是在存储器X的生活。 这是X的地址。 所以与x是x的地址。 让我们这一步 进一步连接到一些东西 我暗示在一先前视频。 如果ARR是double数组,然后 与改编括号我是一个指针 一个双。 好。 常用3方括号我,如果 ARR是双打的阵列, 那么常用3括号我是 该数组的第i个元素, 并与常用3方括号我就是在 存储器改编的第i个元素的存在。 那么,有什么含义吗? 一个数组名,寓意 这整个事情, 是,阵列的名称是 其实本身就是一个指针。 你一直工作 与所有的指针沿着 每次你使用一个数组的时间。 还记得本例 可变范围, 不久我目前的视频结束 一个例子,我们有一个函数 所谓集合int和一个 函数调用集阵列。 而你的挑战,以确定 无论是否,或什么 我们打​​印出值 该函数结束, 在主程序的末尾。 如果从这个例子召回 或者,如果你看过视频, 你知道你 - 在调用的时候 集INT有效地不执行任何操作。 但调用设置阵列一样。 我几分掩饰为什么 这是在该时间的情况下。 我刚才说了,那么它的一个数组,它的 特别的,你知道,有一个原因。 其原因是,阵列的 名字其实只是一个指针, 这里面的这个特殊的 方括号语法 使事情很多更好的工作。 并且他们做的想法 指针少了很多恐吓, 这就是为什么他们排序 呈现的那样。 但实际上数组只是指针。 这就是为什么当我们 做出了改变到阵列, 当我们传递了一个数组作为参数 到函数或作为参数 阵列的一个功能时,内容 在这两个被叫方实际改变 并且在调用者。 这对于所有其他类型的 我们看到变量,情况并非如此。 所以,这只是要保持 当你使用指针介意, 是,一个名 数组实际上是一个指针 该阵列的第一个元素。 OK,现在我们有所有这些 事实,让我们继续前进吧。 我们为什么要关心 其中,一些住。 那么就像我说的,这是相当 要知道一些有用的生活 所以你可以去那里并改变它。 使用它,实际上 有件事,你 要做到这个变量生效, 而不是采取一些它的复印效果。 这被称为间接引用。 我们去参考和 我们改变价值在那里。 因此,如果我们有一个指针,它被称为 电脑,它指向一个字符, 那么我们可以说,* PC和* PC是 什么,我们会发现,如果我们去的名字 到的地址的PC。 我们会发现有一个字符, * PC是我们参考的数据,在该 位置。 因此,我们可以这样说: * PC = D或类似的东西, 这意味着,无论 在内存地址的电脑, 无论角色是以前 在那里,现在是研发,如果说* PC = D。 所以在这里,我们又来了与 一些怪异的Ç的东西,对吧。 因此,我们已经看到了*以前作为 莫名其妙的数据类型的一部分​​, 而现在它在被使用 一个稍微不同的上下文 在一个位置,以访问数据。 我知道这是一个有点混乱, 这实际上是这个整体的一部分 喜欢,为什么指针有这个神话 他们周围的是如此复杂, 是那种语法问题,说实话。 但*用在这两种情况下, 既作为类型名称的一部分, 我们会看到一个小 后来别的东西。 而现在是 引用操作。 如此这般到参考, 它访问数据 在指针的位置,并 可以让你随意操纵它。 现在,这是非常相似的 访问你的邻居吧。 如果你知道你的 邻居的生活,你 未挂出与你的邻居。 你知道你恰巧 知道他们住在哪里, 但是,这并不意味着,通过 凭借具有知识 你与他们的互动。 如果你想与他们进行互动, 你必须去他们家, 你必须去他们住的地方。 一旦你做到这一点, 那么你可以互动 他们就像你想要。 而同样有变数, 你需要去他们的地址 如果你想交互他们, 你不能只知道地址。 而你去这个地址的方法是 使用*,则引用操作。 你觉得会发生 如果我们试图和反引用 一个指针,它的值是空? 回想一下,空 指针指向什么。 所以,如果你尝试取消引用 没事还是去到一个地址什么都没有, 你觉得会发生什么? 那么,如果你猜分割 故障,你是对的。 如果您尝试取消引用 一个空指针, 你受苦分割 故障。可是等等, 我没有告诉你, 如果你不打算 设置你的价值你 指针到一些有意义的事情, 你应该设置为null? 我没有和实际的分割 故障是怎么样的一个很好的行为。 你有没有声明的变量和 没有立即指派它的价值? 所以,你刚才说INT X;你不 实际上它分配给什么 再后来就在你的代码, 你打印出x的值, 有还是没有 其分配到任何东西。 你经常会得到 零,但有时你 可能会得到一些随机数,并 你不知道它是从哪里来的。 同样的事情可以 发生在三分球。 在声明指针 INT * PK为例, 你不将它分配一个值, 你得到四个字节的内存。 任何四个字节的 存储器系统可以 发现有一些有意义的价值。 还有可能是 已经存在的东西了 不再需要由另一 功能,所以你只要有 不管数据在那里。 如果你试图做提领 你没有 - 也有一些地址 已经字节和信息 在那里,这是现在在你的指针。 如果您尝试取消引用该指针, 你可能会和一些内存来搞乱 你不打算 惹这一切。 而事实上,你可以做 一些真正毁灭性的, 像打破另一个程序, 或打破另一项功能, 或者做一些恶意的 你不打算做的。 所以这就是为什么它是 实际上是一个好主意 设置你的指针,如果你为null 不要将它们设置为有意义的事。 它可能会更好的 当天的程序结束 崩溃,然后为它做 一些螺丝了 另一个程序或其他功能。 这种行为很可能是连 不仅仅是崩溃不太理想。 所以这就是为什么它是 实际上是一个好习惯 进入设置你的指针 为空,如果你不将它们 一个有意义的值 马上,你知道的值 并且您可以安全地取消引用。 现在让我们再来看一看 在整体局势的语法。 如果我说INT * P;,你有什么我刚才做了什么? 我所做的就是这一点。 我知道p的值是一个地址 因为所有指针都只是 地址。 我可以提领p 使用*运算符。 在这方面这里,在最 顶部召回*是类型的一部分​​。 为int *是数据类型。 但我可以提领 p使用*运营商, 如果我这样做,如果我去这个地址, 什么都会,我觉得在这个地址? 我会找到一个整数。 因此,为int * p是基本 话说,p是一个地址。 我可以取消引用p和当 我这样做,我会找到一个整数 在该存储器位置。 行,所以我说还有一个 恼人的事情与明星 而这里的地方了 可气的星星是。 你有没有试过声明 相同类型的多个变量 在相同的代码行? 因此,对于第二,假装线, 我的代码实际上有绿色 是不存在的,它只是说:INT X,Y,Z ;. 什么,会做实际创建是 为你三个整数变量, 一个叫X,一个叫 y和一个叫ž。 这是一个办法做到这一点不 不必分割成三行。 这里就是星星得 再烦人不过, 因为*实际上是部分 两者的类型名称和部分 变量名。 所以,如果我说INT * PX,PY,PZ,我 实际上得到的是一个指向整数 所谓PX和两个整数,PY和PZ。 而这可能不是什么 我们希望,这并不好。 所以,如果我想创建多个指针 相同类型的在同一行上, 和星星,我真的需要 做的是说INT * PA,* PB,* PC。 现在刚刚说, 现在告诉你这个, 你可能永远不会做到这一点。 它可能是一个好东西说实话, 因为您可能会在不经意间 省略明星,类似的东西。 这可能是最好的,也许声明 个别行的指针, 但它只是一个又一个 那些烦人的语法 星星东西,使 三分球这么难的工作。 因为它只是这个语法 惹你有工作,通过。 通过练习它 真正成为第二天性。 我仍然犯错误它仍然 编程后10年, 所以不要生气,如果有事 给你,这是很常见的诚实。 这是一种真正的 语法的缺陷。 样的行,所以我答应 我们会重新审视 如何大的概念,是一个字符串。 那么,如果我告诉你,一个 字符串,我们真的有种 在骗你的全部时间。 有没有所谓的数据类型 字符串,而事实上我 在一提到这个我们 最早的视频数据类型, 该字符串是一个数据类型 在CS50.h.为您创建 你必须#包括 CS50.h以便使用它。 那么字符串真的只是 别名的东西 所谓的字符*,一 指针指向字符。 好了三分球,召回, 只是解决了。 那么,什么是大小 在一个字符串的字节? 那么它的四个或​​八个。 而我之所以这么说四 八成是因为实际上它 取决于系统,如果你使用 CS50 IDE,字符*是一个字符的大小 *是8,它是一个64位的系统。 在内存中的每个地址是64位长。 如果您使用的是CS50家电 或使用任何32位机, 你听说过这个词32位 机,什么是32位机? 那么它只是意味着每 在存储器地址是32位长。 因此32位是四个字节。 所以,一个char *为四个或八个 根据你的系统字节。 实际上,任何数据类型, 的指针和指向的任何数据 类型,因为所有指针都只是 地址,是四个或八个字节。 因此,让我们重新审视这个 图,让我们得出结论: 该视频在这里一点点的锻炼。 因此,这里是我们离开了与图 在视频的开始。 那么现在会发生什么,如果我说* PK = 35? 所以,这是什么意思,当我说,* PK = 35? 拿第二。 *峰。 在这里背景下,*是 引用操作。 因此,当提领 操作者的情况下, 我们去的地址指向 通过PK,我们改变我们发现。 因此,* PK = 35有效 这样做是为了在照片。 因此,它基本上是语法 相同的具有所述k = 35。 多一个。 如果我说INT男,创建 一个称为M的新变量。 一个新的盒子,这是因为一个绿色的盒子 它会举行一个整数, 和它的标记微米。 如果我说M = 4,我把 整装进盒子。 如果说PK =​​&M,怎么做 此图的变化? PK =&M,你还记得什么 与操作者或者叫什么名字? 请记住,与一些变量名 是变量名的地址。 所以,我们在说什么是 PK得到m的地址。 所以,有效地会发生什么 图是pk的不再指向 以K,但点到m。 此外指针是非常 棘手一起工作 他们采取了很多 实践中,但因为 他们的能力,让您 传递函数之间的数据 居然有那些 更改生效, 围绕让你的头 是非常重要的。 这可能是最复杂 主题中,我们在CS50讨论, 但值你 使用指针获得 远远超过了并发症 这来自于学习他们。 所以,我希望你最好的 运气了解指针。 我是道格·劳埃德,这是CS50。