我不懂指针

2024-01-28

什么是指针?什么是取消引用?如果p是一个指针,有什么区别*p = some_value and p = other_value?什么是p = &some_variable意思是?什么是NULL指针?当取消引用 NULL 指针时会发生什么?


准备一叠黄色便利贴、一支铅笔、一块橡皮和一支钢笔。

拿一张便利贴。用水平线将其分开。在上面写上“note #1”pen在顶部。 (此标记是永久性的)。写“7”与pencil在底部。将其粘贴到计算机屏幕的左上角。

该注释表示存储整数值 7 的内存位置。顶部是address。每个地点都有自己唯一的永久地址。底部部分是value正在存储。

拿另一个笔记,将其分成两个区域,并在其上类似地写上“note #2”和“13”。将其粘贴到屏幕上第一个旁边。这是另一个存储整数值的内存位置,这次是 13。

现在再记一下。在注释的“地址”部分写下“注释#3”。在注释的“值”部分写“note #1“(使用铅笔!)。您刚刚创建了一个pointer。将其贴在前两个音符旁边。

现在在另一张纸上写下一些简写:

a    int     #1
b    int     #2
p    int*    #3

这代表了一个符号表. a, b and p是*变量名`。在下一列中,我们有它们的类型,第三列包含它们的地址。

现在让我们做一些 C 语句。

a = 77;

Look up a在你的符号表中。它是#1。擦掉这张纸条的数值部分并写入77相反(这就是橡皮擦派上用场的地方)。

b = 2017;

这与上一个完全类似。

a = b;

Look up a and b在你的符号表中。他们分别是#1和#2。看看注释#2 在其“值”部分有什么。将该数字复制到注释 #1 的值部分。

*p = 42;

Look up p在你的符号表中。这是注释#3。现在找到注释#3的值部分写有数字的注释。这就是所谓的操作解引用。它表示为*在上面的符号中。擦除 value 部分中的所有内容that注意(不是#3,#3 是指着) 和写42反而。

*p = b; 

自己做这件事。这是您应该得到的:

p = &b;

再次抬头看p and b在你的符号表中(分别是#3和#2)。现在采取地址部分#2 的操作(即由&,毫不奇怪,经常被称为地址运算符)并将其复制到价值部分#3(当然删除之前的内容)。

*p = 42;

现在应该很容易了。

现在在 #4 下创建另一个指针。将其归档到符号表中:q.

q = NULL;

Find q(这是#4注释)并写下note #0在价值部分。请注意,没有注释#0。那是一个空指针。它不指向任何地址。

注意:该标准并不强制要求空指针实际表示为 0。它可能是note #99999999 or note #-1或者其他什么,只要它与所有现有的笔记不同

p = q;

自己做这件事。这是您应该得到的:

*p = 42;

应该发生什么?表面上你应该采取p(这是#3),找出它指向哪个注释,然后更改该注释。但现在它指向注释#0,并且没有这样的注释。您已调用未定义的行为。 C 标准明确拒绝指定您的程序应该做什么。实际上,它很可能会崩溃,并显示诸如“分段错误(核心转储)”或“程序已停止工作”之类的消息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我不懂指针 的相关文章

随机推荐

  • 为什么在 iOS 6 中分配新图像时 UIImageView 会调整大小?

    应用程序包含一个 UITableView 其中包含一个自定义 UITableViewCell 该单元格又 包含一个 UIImageView 问题在于 在 cellForRowAtIndexPath 中设置图像会使图像占据整个 UITable
  • 我怎样才能在NodaTime中知道城市和它的时区之间的关系?

    目前我正在使用 NodaTime 从国家 地区获取时区 但问题是一个国家 地区是否有多个时区 我怎样才能知道该时区的城市列表 我需要知道这两个数据之间的映射 NodaTime 可以吗 正确的处理方法如下 查找每个位置的纬度和经度 如果这些是
  • 使用 MVCContrib 对 MVC 3 控制器和视图进行单元测试时将键和值添加到 RouteData

    好的 我正在使用 MVCContrib TestHelper 对我的控制器进行单元测试 效果很好 不过 像很多人一样 通过单元测试 我真正的意思是这里的集成测试 我想至少确保我的视图在给定提供的模型的情况下呈现没有错误 否则我可能会错过一整
  • SwiftUI NavigationView/Stack(如果可用)iOS 15/16

    关于从NavigationView to NavigationStack适用于 SwiftUI 4 和 iOS 16 我有 2 个应用程序在 App Store 上运行 针对 iOS 15 及更高版本 当然我正在使用NavigationVi
  • 获取 contenteditable DIV 中插入符的 HTML 位置

    我无法弄清楚如何在包含 HTML 标签的 DIV 容器中获取插入符位置 我正在使用这个 JavaScript 函数来做到这一点 function getCaretPosition if window getSelection window
  • 支持 src/ 和 test/ 的简单 ant 构建脚本?

    目前 我使用 IDE 进行所有构建和单元测试 现在我需要使用ant 我发现了一些简单的 ant build xml 脚本 但它们不支持单独的 Junit test 目录 我的项目结构如下 src com foo com bar test M
  • java中同一数组的元素比较

    我正在尝试比较同一数组的元素 这意味着我想将 0 元素与其他所有元素进行比较 将 1 元素与其他所有元素进行比较 依此类推 问题是它没有按预期工作 我所做的是我有两个从 0 到 array length 1 的 for 循环 然后我有一个
  • Netbeans 7.2 显示“无法解析标识符”,尽管构建成功

    我正在使用Netbeans IDE 7 2 with C C 插件 最新版本 1 18 1 1 和 如果我构建我的项目 一切都很好 但 IDE 会显示错误 例如 无法解析标识符 其他人也有这个错误 我该如何解决它 这是我对另一个问题的回答的
  • NEST (elasticsearch) 在多个字段中突出显示

    我已经使用 Nest 成功获得了结果和突出显示 但如果我包含两个字段来搜索突出显示 则它在构建 elasticsearch 查询时仅使用最后一个字段 例如下列 Query qry gt qry QueryString qs gt qs Qu
  • 将 SoapHeader 添加到 org.springframework.ws.WebServiceMessage

    如何将对象添加到肥皂头org springframework ws WebServiceMessage 这是我希望最终得到的结构
  • 有没有可以替代 parse_qs 来处理分号的方法?

    TL DR 哪些库 调用可用于处理包含与 parse qs 不同的分号的查询字符串 gt gt gt urlparse parse qs tagged python ruby gt gt gt tagged python 完整背景 我正在使
  • Grafana 在 url 中传递访问令牌

    我创建了一个 API 密钥来与第三方应用程序共享 grafana 面板 我想将它嵌入到 iframe 中 但它要求我登录 如何在 url 中发送访问令牌 我一直在关注 http self issued info docs draft iet
  • 使用Python OpenCV将QR码旋转到正确的位置

    我是Python的初学者 目前正在研究二维码检测和解码 我很难将检测到的二维码旋转到正确的位置 我已经用过minAreaRect 旋转我的二维码 但它不起作用 有没有解决方法或正确的方法来做到这一点 谢谢 ROI2 cv2 imread R
  • 列出 LDAP 中的根上下文

    我想列出或搜索 LDAP 树中的根上下文 我使用 Apache Directory Server 和 Java Hashtable
  • 使用未分配的局部变量“字典”

    尽管我在以下代码中分配了值 但仍收到错误 使用未分配的局部变量 字典 private static void UpdateJadProperties Uri jadUri Uri jarUri Uri notifierUri Diction
  • 如何在真实设备上调试(使用Eclipse/ADT)

    我正在尝试弄清楚如何直接在我的手机 HTC Desire 上调试应用程序 我已经安装了手机附带的 USB 驱动程序 并且使用 adb devices 时会列出手机 如何配置 eclipse ADT 在手机上启动而不是启动模拟器 虚拟设备 注
  • ASP.NET MVC 和 WCF

    我目前正在努力学习 MVC 但在我的 在某个时刻学习 列表中 我还学习了 WCF 我只是想知道 WCF 是否应该 可以在 MVC 应用程序中使用 背景是我想要一个桌面应用程序 NET 3 5 WPF 与我的 MVC 网站交互 我想知道在两者
  • 通过单个命令安装私有和公共 NPM 软件包

    我在 package json 文件中列出了一些 npm 包 有些是公共的 有些是私有的 我想通过使用在单个命令中安装两种类型的包npm install 如果 npm 注册表设置为全局 则私有包显示404 那么如何通过单个命令来实现这一点
  • jetty-maven-插件和 loadTimeWeaver

    似乎无法让我的 Spring Web 应用程序与 jetty maven 插件一起使用 我总是得到 org springframework beans factory BeanCreationException Error creating
  • 我不懂指针

    什么是指针 什么是取消引用 如果p是一个指针 有什么区别 p some value and p other value 什么是p some variable意思是 什么是NULL指针 当取消引用 NULL 指针时会发生什么 准备一叠黄色便利