获取数组变量的地址是什么意思?

2024-05-14

今天我读到了一段让我很困惑的 C 代码片段:

#include <stdio.h>

int
main(void)
{
    int a[] = {0, 1, 2, 3};

    printf("%d\n", *(*(&a + 1) - 1));
    return 0;
}

在我看来,&a + 1没有任何意义,但运行没有错误。

这是什么意思?并且是否涵盖这个?

更新0: 读完答案后,我意识到这两个表达主要让我感到困惑:

  1. &a + 1,在 Stack Overflow 上有人提出这样的问题:

  2. *(&a + 1) -1,这与数组衰减有关。


首先有一点提醒(或者一些新的东西,如果你以前不知道的话):对于任何数组或指针p和索引i表达方式p[i]完全一样*(p + i).

现在希望能帮助您了解发生了什么......

数组a程序中的内容存储在内存中的某个位置,具体位置并不重要。获取所在位置a被存储,即得到一个指向a,您使用地址运算符& like &a。这里要学习的重要一点是,指针本身并不意味着什么特殊的,重要的是基本类型的指针。的类型a is int[4], i.e. a是一个由四个组成的数组int元素。表达式的类型&a是一个指向四个数组的指针int, or int (*)[4]。括号很重要,因为类型int *[4]是一个由四个指针组成的数组int,这是完全不同的事情。

现在回到最初的观点,即p[i]是相同的*(p + i)。代替p我们有&a,所以我们的表达*(&a + 1)是相同的(&a)[1].

现在这解释了什么*(&a + 1)意味着什么以及它有什么作用。现在让我们思考一下数组的内存布局a。在记忆中它看起来像



+---+---+---+---+
| 0 | 1 | 2 | 3 |
+---+---+---+---+
^
|
&a;
  

表达方式(&a)[1] treats &a因为它是一个数组的数组,但它绝对不是,并且访问该数组中的第二个元素,这将超出范围。这当然从技术上来说是未定义的行为。让我们暂时运行一下,并考虑一下如何that在记忆中看起来像:



+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | . | . | . | . |
+---+---+---+---+---+---+---+---+
^               ^
|               |
(&a;)[0]         (&a;)[1]
  

现在请记住,类型a(这与(&a)[0]因此意味着(&a)[1]也必须是这种类型)是四个数组int。由于数组自然会衰减为指向其第一个元素的指针,因此表达式(&a)[1]是相同的&(&a)[1][0],其类型为指向int。所以当我们使用(&a)[1]在表达式中,编译器给我们的是一个指向第二个(不存在的)数组中第一个元素的指针&a。我们再一次来到了p[i] equals *(p + i)方程:(&a)[1] is a 指向int, it's p in the *(p + i)表达式,所以完整的表达式是*((&a)[1] - 1),然后查看上面的内存布局减去一int从给出的指针(&a)[1]给我们之前的元素(&a)[1]这是最后一个元素(&a)[0],即它给了我们(&a)[0][3]这与以下相同a[3].

所以表达*(*(&a + 1) - 1)是相同的a[3].

它很冗长,并且穿越了危险的领域(越界索引),但由于指针算术的力量,最终一切都解决了。不过,我不建议您编写这样的代码,它需要人们真正了解这些转换如何工作才能破译它。

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

获取数组变量的地址是什么意思? 的相关文章

随机推荐

  • 在 pygame 中,我如何创建一个数据结构来跟踪调整大小事件和对象的坐标?

    我希望在调整屏幕大小后使鼠标事件与对象保持同步 有人告诉我需要创建一个数据结构来跟踪 调整事件大小 新坐标以匹配调整大小 如何使用简单的代数方程来完成此操作并将其集成到调整大小事件中以进行准确更新 反过来做 创建一个虚拟游戏地图 在绘制场景
  • 子类 B 继承自模板类 A [重复]

    这个问题在这里已经有答案了 我最近偶然发现了如下代码 但我无法理解它 template
  • Winform 上的 C# ComboBox 是否有 BeforeUpdate

    我来自 VBA 世界 记得有一个BeforeUpdate我可以在组合框上进行调用 现在我使用 C 并且喜欢它 我想知道是否有一个BeforeUpdate呼吁ComboBox在 Winform 上 我可以制作一个不可见的文本框并在那里存储我需
  • 生成一个新终端并写入其标准输出

    我有一个应用程序 它使用 GUI 来完成与用户的大部分界面 不过 我想要一个单独的终端窗口 我可以写入一些错误检查 原始值等 我知道我可以使用以下命令生成一个新终端system 命令 但我不知道是否可以进行交互 在最好的情况下 我希望有一个
  • 定时任务应该放在哪一层?

    我正在尝试使用分层架构来实现 DDD 应用程序 我有 基础设施层 实现应用程序的技术特定部分的层 领域层 包含领域模型的层 应用层 包含与领域模型交互的干扰的层 接口层 从外部接收事件的层 经典的 3 层 基础设施 架构非常清晰 但我的应用
  • 对 URL 进行编码 C#

    所以我有一个看起来像这样的 URL http www test com folder1 id 3 但基本上 当他们单击按钮时 我想在 URL 栏中显示与该 id 关联的值的名称 例如 id 3 是名为 Rollex 的手表 所以我想要读取
  • scala中的反引号有什么用[重复]

    这个问题在这里已经有答案了 我在一本书上找到了以下代码 val list List 5 4 3 2 1 val result 0 list running total next element running total next elem
  • CouchDB 中的分页?

    我将如何实现分页所需的查询 基本上 当请求第 1 页时 获取前 5 个条目 对于第 2 页 获取接下来的 5 页 依此类推 我计划通过 couchdb python 模块使用它 但这不会对实现产生任何影响 The CouchDB 指南 ht
  • 如何解构 React props 并仍然访问其他 props?

    我很好奇如果我想要所有的 props 但也想要解构单个属性 那么组件的参数 props 是否可以像导入一样解构 我想这更像是一个 JavaScript 问题 而不是一个 React 问题 但是举个例子 import React useEff
  • 无需递归即可对可观察结果进行分页 - RxJava

    我有一个非常标准的 API 分页问题 您可以通过一些简单的递归来处理 这是一个捏造的例子 public Observable
  • 为什么 C11 标准不删除不安全的 strcat()、strcpy() 函数?

    C11 C 14标准已经下降gets 本质上不安全的函数会导致安全问题 因为它不会在缓冲区溢出时执行边界检查结果 那么为什么C11标准不下降strcat strcpy 功能 strcat 函数不会检查第二个字符串是否适合第一个数组 strc
  • 用于从某些标记生成 ASCII 图表的工具?

    有没有一种工具可以从某种标记生成 ASCII 图表 用例 能够快速创建和编辑可嵌入 javadoc 或任何其他注释 中的图表 类似于允许我们编写一些标记的内容 A HAS gt B B HAS gt C 该工具将生成可视化结果 A HAS
  • Swift - 将图像插入 PDF 不再适用于 iOS 13

    目前正在开发在我的贷款计算器应用程序上导出 PDF 的功能 我有一个预览屏幕 可以在您保存 PDF 之前显示它 预览屏幕由带有 html 的 webView 组成 其中包含占位符 我能够成功地将图像插入到正确的占位符上 并将其显示在 PDF
  • postgresql-按每个元素中的单词对数组进行排序

    有字符串数组 ARRAY CAT CAT DOG CAT DOG Cat 现在我想根据每个元素中的单词数对该数组进行排序 我已经尝试过 但没有取得任何成功 我想要这个输出 ARRAY CAT DOG CAT DOG CAT Cat 我怎样才
  • AndEngine MenuScene - 无法单击按钮

    我有一个关于 android 和 andengine 的小问题 这是我的主菜单的源代码 AbstractScene is extending Scene public class MainMenuScene extends Abstract
  • 如何在同一设备上运行的 Android 应用程序之间传输文件?

    我正在编写一个与 RESTful 服务交互的 Android 应用程序 该 Web 服务本质上是一个文件系统 并提供元数据以及对文件的 CRUD 访问 我的应用程序检索元数据 并通过ContentProvider 我需要添加与我的应用程序在
  • TableView 中图像的大小不正确

    我正在使用来自 URL 的图像创建一个表视图 但图像不会调整到所有视图的大小 直到我将其按入行中 知道为什么会发生这种情况吗 这是一个自定义的表格视图 我的代码是 UITableViewCell tableView UITableView
  • 测试 jQuery UI 工具提示是否打开

    我正在尝试控制自动打开和关闭jQuery 工具提示 http api jqueryui com tooltip 如何测试工具提示的当前状态是否为打开 我正在使用所有内容的最新版本 Thanks 您可以尝试检查是否有任何课程ui toolti
  • 将 OpenXML 文档嵌入到另一个 OpenXml 文档中

    我需要在一个文件夹中收集多个 docx 文件 并将它们 链接 到一个将显示给用户的文档中 现在我已经读过了布莱恩 琼斯的文章 http blogs msdn com brian jones archive 2009 06 30 embedd
  • 获取数组变量的地址是什么意思?

    今天我读到了一段让我很困惑的 C 代码片段 include