C 中二维数组的内存映射

2024-01-15

你觉得什么这次讨论 http://www.mattababy.org/~belmonte/Teaching/CCC/CrashCourseC.html关于二维数组的内存映射是否正确?尤其是这张照片? http://www.mattababy.org/~belmonte/Teaching/CCC/CCC/transparent_figure5.gif你能解释一下这个理论吗?

假设我们在 C 中声明一个二维数组,如下所示:

int arr[3][3]={10, 20, 30, 40, 50, 60, 70, 80, 90};

现在,根据此讨论,内存将按如下方式排列:

现在,我编写了以下代码来测试这个理论:

#include <stdio.h>

main()
{
    int arr[3][3]={10, 20, 30, 40, 50, 60, 70, 80, 90};
    printf("      arr==%d\n", arr);
    printf("  &arr[0]==%d\n", &arr[0]);
    printf("   arr[0]==%d\n", arr[0]);
    printf("&arr[0][0]=%d\n", &arr[0][0]);
    printf(" arr[0][0]=%d\n", arr[0][0]);
}
/*
Output:
========
      arr ==1245028
  &arr[0] ==1245028
   arr[0] ==1245028
&arr[0][0]==1245028
 arr[0][0]==10
Press any key to continue...
*/

为什么前 4 个输出相同?


在这里查看我的问题。 https://stackoverflow.com/questions/2565039/how-are-two-dimensional-arrays-formatted-in-memory

这不是访问二维数组信息的方式。事实上,您可以将它们视为一维,其中以特殊方式将索引相乘和相加。

e.g.

int x[10] = {0,1,2,3,4,5,6,7,8,9};
int y[2][5] = {{0,1,2,3,4},{5,6,7,8,9}};

它们在内存中的格式完全相同,如下所示:

|0|1|2|3|4|5|6|7|8|9|

所以要得到8元素,您可以要求x[8], or y[1][3].

对于第二种方式,你可以将其视为(1 * 5) + 3.

这就是为什么你的前 4 个是相同的。你有:

  • arr:这是数组的起始地址
  • arr[0]:这是第一个子数组的起始地址,与整个数组的起始地址相同
  • &arr[0][0]:这是第一个子数组的第一个元素的地址,也是整个数组的开始
  • arr[0][0]:这是存储在第一个子数组的第一个元素中的值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 中二维数组的内存映射 的相关文章

随机推荐

  • iOS6 上的 CFAutoRelease() 类似行为

    我有一个方法可以创建 ABRecordRef 设置其属性并返回引用 我在使用 CFAutoRelease 时遇到崩溃 因为我需要支持 iOS ABRecordRef myRecord ABRecordRef newRecord ABPers
  • 熊猫按组丢弃前导零值

    我想删除 值 列中为零的行 直到每个组的第一个非零值的索引 Input df pd DataFrame date 2019 01 01 2019 01 02 2019 01 03 2019 01 04 2019 01 01 2019 01
  • 使用单独的 Boost 库进行编译,无需安装 Boost

    我正在实现一些我希望尽可能可移植的 C 代码 我想avoid对需要 root 访问权限才能安装的库的依赖关系 此外 我宁愿避免在我的存储库中保留大型库的副本 而且我也不想对库进行用户级安装 仅仅是因为我必须在多台计算机上手动安装它们 我想使
  • Angular 2/4 如何获取应用程序组件中的路由参数?

    As I am new to angular 2 4 I am having trouble setting up a new application as per my need 我正在尝试构建一个应用程序 该应用程序将从另一个应用程序中
  • Xcode 错误:AR 参考图像必须具有非零正宽度

    帮助 我正在使用 ARKit 的图像检测 但我不知道为什么我放置在 AR Reference 文件夹中的每个图像都有错误 AR 参考图像 名称 必须具有非零正宽度 我不太确定这意味着什么 而且当我用谷歌搜索时我没有任何运气 我该如何解决 当
  • Git 存储库损坏(数据流错误)[重复]

    这个问题在这里已经有答案了 我收到这些错误 X WAMP www topsecret gt git fsck full error inflate data stream error invalid code lengths set err
  • 将一个数组中的属性添加到具有相同键的另一个数组中

    我没有用文字解释问题 而是在下面做了一个快速的视觉表示 假设我有以下数组 let arr1 id 1 someKey someValue id 2 someKey someValue 和另一个数组 let arr2 id 1 numberO
  • 无法从heroku上的解析服务器发送电子邮件

    我正在 Heroku Parse Server 上运行我的迁移应用程序 当我尝试使用 requestPasswordResetInBackground 从我的应用程序发送密码重置电子邮件时 出现以下错误 密码重置功能需要 appName p
  • 将 Maven 项目导入 Eclipse 并修复错误

    我导入了一个项目到 eclipse 我在每个类名中都有很多错误 甚至像 String 这样的类 我在课堂上犯的错误是Implicit super constructor Object is undefined for default con
  • Tomcat项目清理错误

    当我尝试从 tomcat 中清理项目时 我收到此错误 无法删除 可能被另一个进程锁定 有什么办法可以解决这个问题吗 首先 尝试只restart tomcat 然后 尝试clean一切 清理Tomcat服务器 在Eclipse中 右键单击To
  • iOS通用应用程序链接是否支持使用同一域的多个应用程序?

    背景 为多个客户端构建普通应用程序 相同的代码库具有不同的包 ID 即 com 公司 client1 com 公司 client2 希望使用相同的通用应用程序链接支持所有客户端版本 即 company com app path 尝试将其添加
  • 在Emacs中,如何在当前文件的函数之间跳转?

    我想快速将指向移动到 Emacs 缓冲区中的函数 我想运行一些函数并得到一个提示 询问我函数名称 并为当前缓冲区中定义的每个函数提供完成 我通常使用 etag 进行导航 但有时我正在寻找已在多个文件中覆盖的框架方法 在这些情况下 我可以找到
  • 有没有办法像我们在 iOS 中那样将用户发送到 macOS 下应用程序的隐私设置?

    与许多应用程序一样 如果禁用了某些隐私权限 我的 iOS 应用程序将为用户提供打开应用程序设置页面的机会 在iOS中 使用特殊的UIApplicationOpenSettingsURLString openSettingsURLString
  • 为什么在中断上下文中执行的内核代码/线程无法休眠?

    我正在阅读罗伯特 洛夫 Robert Love 撰写的以下文章 http www linuxjournal com article 6916 http www linuxjournal com article 6916 说的是 让我们讨论一
  • 从 URL 打开应用程序适用于 Android 版 Firefox,但不适用于 Google Chrome

    我想在用户点击我的网页链接 最好是来自 Facebook 共享帖子 但让我们从纯 URL 开始 时打开我的 Android 应用程序 为了实现这一目标 我创建了一个 ActivityUrlReceiver并将此代码添加到我的AndroidM
  • 你会写 seq x x 吗?

    我不太清楚 seq 在 Haskell 中是如何工作的 看来在很多情况下写起来很有用 seq x x 甚至可以定义一个函数 strict x seq x x 但这样的功能还不存在 所以我猜这种方法在某种程度上是错误的 有人可以告诉我这是否有
  • 列表框鼠标悬停背景颜色

    我遇到的问题是 MouseOver 触发器在选定的行上为背景着色失败 对于任何未选定的行 鼠标悬停时背景会变成蓝色 但所选行没有蓝色背景 单击一行 然后蓝色背景消失 我还尝试了 ListBox ItemContainerStyle 中的样式
  • XmlDocument.WriteTo 截断生成的文件

    尝试将 XmlDocument 序列化为文件 XmlDocument 相当大 但是 在调试器中我可以看到 InnerXml 属性中包含所有 XML blob 它没有被截断 以下是将 XmlDocument 对象写入文件的代码 Write t
  • 聊天应用程序:node.js 还是 APE?

    我想创建一个聊天应用程序 它将使用 php codeigniter 来执行视图和用户界面 我在 stackoverflow 上阅读了很多推荐 node js 或 socket io 的帖子 但我也遇到过 APE Ajax Push Engi
  • C 中二维数组的内存映射

    你觉得什么这次讨论 http www mattababy org belmonte Teaching CCC CrashCourseC html关于二维数组的内存映射是否正确 尤其是这张照片 http www mattababy org b