如何在c中创建一个n维数组

2024-03-27

我正在考虑编写一个函数,它接受 n 个参数并使用这些参数作为维度返回一个 n 维数组。现在我意识到一维和二维数组很容易用指针实现。对于二维数组,片段将类似于(标准方式):

int** x;
int* temp;

x = (int**)malloc(m * sizeof(int*));
temp = (int*)malloc(m*n * sizeof(int));
for (int i = 0; i < m; i++) {
  x[i] = temp + (i * n);
}

其中数组的大小为 m*n;但问题在于我们如何找到n维数组的嵌套循环参数?有什么办法可以优化代码吗?


这展示了如何创建 N 维数组以及如何为其元素建立索引。这些提供了所需的基本机制。这是学生在学习时考虑到的,但在实践中却很少运用。通常有更好的方法来组织数据结构。此外,大多数有用的算法都具有遍历数据的模式,因此最好构建以增量方式有效更新索引的代码,而不是从头开始重新计算它们,如下所示。

/*  Note:  For demonstration purposes only.  Depending on needs, other types
    might be used for indices and sizes, and the array type might be wrapped
    in an opaque struct rather than exposed as "int *".
*/


//  Create an array with N dimensions with sizes specified in D.
int *CreateArray(size_t N, size_t D[])
{
    //  Calculate size needed.
    size_t s = sizeof(int);
    for (size_t n = 0; n < N; ++n)
        s *= D[n];

    //  Allocate space.
    return malloc(s);
}

/*  Return a pointer to an element in an N-dimensional A array with sizes
    specified in D and indices to the particular element specified in I.
*/
int *Element(int *A, size_t N, size_t D[], size_t I[])
{
    //  Handle degenerate case.
    if (N == 0)
        return A;

    //  Map N-dimensional indices to one dimension.
    int index = I[0];
    for (size_t n = 1; n < N; ++n)
        index = index * D[n] + I[n];

    //  Return address of element.
    return &A[index];
}

使用示例:

//  Create a 3*3*7*7*9 array.
size_t Size[5] = { 3, 3, 7, 7, 9 };
int *Array = CreateArray(5, Size);

//  Set element [1][2][3][4][5] to -987.
*Element(Array, 5, Size, (size_t []) { 1, 2, 3, 4, 5 }) = -987;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在c中创建一个n维数组 的相关文章

  • 内联函数/方法

    声明 内联函数必须在调用之前定义 这个说法正确吗 EDIT 该问题最初是德语 内联功能穆森 弗 伊赫雷姆 奥夫鲁夫定义 sein 也许它对任何人都有帮助 是的 它是正确的 但只是部分正确 它可能正确地重新构建如下 内联函数必须在每个翻译单位
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • 为什么Apache MPM prefork.c 使用互斥体来保护accept()?

    我坐下来读书Apache 的 MPM prefork c http code metager de source xref apache httpd server mpm prefork prefork c这段代码使用了一个名为accept
  • 在 C# 中生成 HMAC-SHA1

    我正在尝试使用 C 来使用 REST API API 创建者提供了以下用于 hmac 创建的伪代码 var key1 sha1 body var key2 key1 SECRET KEY var key3 sha1 key2 var sig
  • 如何尝试/捕获所有异常

    我正在完成由其他人启动的 UWP 应用程序 该应用程序经常崩溃 我总是陷入困境应用程序 at if global System Diagnostics Debugger IsAttached global System Diagnostic
  • C# 正则表达式用于查找 中具有特定结尾的链接

    我需要一个正则表达式模式来查找字符串 带有 HTML 代码 中的链接 以获取文件结尾如 gif 或 png 的链接 示例字符串 a href site com folder picture png target blank picture
  • C++中delete和delete[]的区别[重复]

    这个问题在这里已经有答案了 可能的重复 C 中的删除与删除 运算符 https stackoverflow com questions 2425728 delete vs delete operators in c 我写了一个包含两个指针的
  • 在 C# Winforms 应用程序中嵌入 Windows XP 主题

    我有一个旧版 C Windows 窗体应用程序 其布局是根据 Windows XP 默认主题设计的 由于需要将其作为 Citrix 应用程序进行分发 该应用程序现在看起来像经典主题应用程序 因为 Citrix 不鼓励使用主题系统服务 所以
  • 如何使用MySqlCommand和prepare语句进行多行插入?(#C)

    Mysql 给出了如何使用准备语句和 NET 插入行的示例 http dev mysql com doc refman 5 5 en connector net programming prepared html http dev mysq
  • 带 If 的嵌套 For 循环的时间复杂度

    void f int n for int i 1 i lt n i if i int sqrt n 0 for int k 0 k lt pow i 3 k do something 我的思考过程 执行if语句的次数 sum i 1 to
  • 如何生成 appsettings..json 文件?

    我有一个 ASP NET Core 2 WebAPI 它将部署在以下环境中 INT QA STAGE 生产环境 基于上述 我需要有appsettings
  • 从 Code::Blocks 运行程序时出现空白控制台窗口 [重复]

    这个问题在这里已经有答案了 当我尝试在 Code Blocks 中构建并运行新程序时 控制台窗口弹出空白 我必须单击退出按钮才能停止它 它对我尝试过的任何新项目 包括 Hello world 都执行此操作 奇怪的是 它对于我拥有的任何旧项目
  • C# 委托责任链

    为了我的理解目的 我实现了责任链模式 Abstract Base Type public abstract class CustomerServiceDesk protected CustomerServiceDesk nextHandle
  • 为什么 clang 使用 -O0 生成低效的 asm(对于这个简单的浮点和)?

    我正在 llvm clang Apple LLVM 版本 8 0 0 clang 800 0 42 1 上反汇编此代码 int main float a 0 151234 float b 0 2 float c a b printf f c
  • C++ 插件的“最适合”动态类型匹配

    我有一个几乎所有东西都是插件的架构 该架构以图形用户界面为基础 其中每个插件都由一个 表面 即用户可以通过其与插件交互的 UI 控件 表示 这些表面也是插件 每当添加新插件时 瘦主机都会自动确定哪个可用表面与其最匹配的 UI 如何在 C 中
  • 从 R 到 C 处理列表并访问它

    我想使用从 R 获得的 C 列表 我意识到这个问题与此非常相似 使用 call 在 R 和 C 之间传递数据帧 https stackoverflow com questions 6658168 passing a data frame f
  • 在 C++17 中使用 成员的链接错误

    我在 Ubuntu 16 04 上使用 gcc 7 2 并且需要使用 C 17 中的新文件系统库 尽管确实有一个名为experimental filesystem的库 但我无法使用它的任何成员 例如 当我尝试编译此文件时 include
  • 为什么文件更新时“如果较新则复制”不复制文件?

    我在 Visual Studio Express 中有一个解决方案 如下所示 The LogicSchemaC 中的类 将在运行时解析指定的 XML 文件 以下是在main的方法Program cs LogicSchema ls new L
  • 在 Xamarin 中获取 OutOfMemoryException

    java lang OutOfMemoryError 考虑增加 JavaMaximumHeapSize Java 执行时内存不足 java exe 我的 Visualstudio Xamarin 项目出现内存不足异常 请帮助我如何解决此问题
  • 如何使用 C# 以低分辨率形式提供高分辨率图像

    尝试使用 300dpi tif 图像在网络上显示 目前 当用户上传图像时 我正在动态创建缩略图 如果创建的页面引用宽度为 500x500px 的高分辨率图像 我可以使用相同的功能即时转换为 gif jpg 吗 将创建的 jpg 的即将分辨率

随机推荐

  • 人物分类

    又是一个简单的问题 有一个std string 根据用户的语言和区域设置 区域设置 确定哪些字符是数字 符号 空格等 我设法使用以下命令将字符串拆分为一组字符boost 区域设置边界分析工具 http www boost org doc l
  • 构建哈希表/哈希函数

    我想构建一个哈希表 用于查找 1 到 15 个字节的字节序列 字符串 中的键 我想存储一个整数值 所以我想一个用于散列的数组就足够了 我很难概念化如何构造一个哈希函数 以便给定的键将给出数组的索引 任何帮助将不胜感激 哈希中的最大条目数为
  • 在基类中实现 Swift 协议方法

    我有一个 Swift 协议 它定义了如下方法 protocol MyProtocol class func retrieve id String gt Self 我有几个符合此协议的不同类 class MyClass1 MyProtocol
  • 如何使用 AS3 单击 Flash 中的显示对象?

    我正在创建一个照片编辑器应用程序 在某些时候 您编辑的照片应该放置在两层 DisplayObjects 背景图像和图像蒙版 之间 但有一个问题 当您正在编辑的图像被放置在背景层和图像遮罩层之间时 它变得不可点击 因此卡在那里 没有机会再次拖
  • Boto:从配置中动态获取Python代码中的aws_access_key_id和aws_secret_access_key?

    我有我的aws access key id and aws secret access key存储在 boto我想知道是否有办法使用 Boto 在我的 python 代码中检索这些值 因为我需要将它们插入到我的 SQL 语句中以从 S3 复
  • Azure:从应用服务访问 Key Vault 时如何修复“策略要求调用者‘...’使用代表 (OBO) 流”?

    我有一个在 Azure 应用服务中运行的 ASP net Core 3 1 应用程序 开始使用 Azure Key Vault 存储应用程序的连接字符串和其他机密后 该应用程序现在崩溃并显示以下错误 HTTP 错误 500 30 ANCM
  • 从 serverless.yml 中引用函数

    我有几个正在运行的 AWS lambda 由无服务器框架 我需要一个 lambda 称为lambdaOne 这将调用第二个 lambda 称为lambdaTwo 使用 AWS 的 javascript sdk 问题是我得到了AccessDe
  • RDF和OWL工作流程问题

    我一直在通过 Protege 查看和使用 OWL 我想知道我是否正确理解 工作流程 和它的想法 从头开始构建数据库 使用 Protege 或等效工具为您的数据生成 OWL 本体 将此模式导出为 RDF 使用定义为三元组中的某些元素的类以及目
  • .NET 在为 WCF 服务生成类型时加载并寻找另一个版本的程序集

    我在 Visual Studio 2013 中尝试向 ASP NET Web 应用程序添加服务引用时遇到此错误 我在项目中引用了 Microsoft Owin Security 版本 2 1 0 0 但我很沮丧为什么他要寻找2 0 1 0版
  • 使用数据库优先方法为 Entity Framework 5 中的所有实体创建基类

    我在每个表上都有一些属性 例如 CreatedDate ModifiedDate VersionNo 每次修改实体时 我都需要更改 添加这些属性的值 我认为我可以使用这些属性创建一个基类 并让实体从该基类派生 并且在基于 ObjectSta
  • 每个数据库名称 Ansible 运行一次任务

    我正在使用 ansible 将多个站点部署到同一服务器 每个站点都是 ansible 中的一个单独的 主机 hosts库存 效果非常好 但是 只有两个数据库 生产数据库和测试数据库 如何确保每个数据库只运行一次数据库迁移任务 我读过grou
  • 可以弹簧@Autowired Map吗?

    这是地图 Autowired private Map
  • Google appengine blobstore 上传处理程序处理额外的表单发布参数

    我希望有一个文件上传表单 除了文件选择输入之外 还具有其他输入字段 如文本区域 下拉列表等 问题是我无法访问除 blobstore 上传处理程序中的文件之外的任何发布参数 我使用以下函数调用来获取参数名称 但它始终返回空屏幕 par sel
  • PHP 中的 HTTP_HOST 和 SERVER_NAME 有什么区别?

    有什么区别 SERVER HTTP HOST and SERVER SERVER NAME in PHP 您什么时候会考虑使用其中一种而不是另一种 为什么 The HTTP HOST是从获得HTTP 请求头 http www w3 org
  • popToRootViewControllerAnimated 并释放所有视图

    我有一个 UINavigationController 它要求提供一些信息 用户导航直到最后 一旦到达那里 他们就可以接受或取消所有已输入的数据 他们选择哪个选项并不重要 因为他们总是会使用 UINavigationController p
  • 统一更新:使用本地文件的更新更新私有存储库(重构、重命名、更新)并从原始存储库获取定期更新

    我刚刚开始学习 Windows 上的 GitHub CLI 工具 认为我是新手 我有一个如下所示的用例 在深入探讨之前 让我先总结一下 我的用例是 克隆一个开源项目 它更新 定期 即创建它的本地副本并进行修改 包括 重命名文件和文件夹 将更
  • 准备重用

    有人可以告诉我如何使用prepareForReuse吗 我已经搜索了几个小时并阅读了开发文档 在扩展 UITableViewCell 的自定义单元中 我有prepareForReuse 方法及其被调用 但我该如何处理它 存在渲染问题 我这样
  • 有没有办法让无线电组水平布局?

    我在单选按钮组内有 2 个单选按钮 现在它们垂直排列 我尝试将它们放入水平容器中 但没有用 有没有办法让一组单选按钮水平排列
  • 在当前位置插入文本 TINYMCE IE9

    如何将文本插入到tinyMce编辑器的当前位置 它在 Chrome FF Safari 中完美运行 但在 IE 中它始终从文本区域的顶部开始 我目前执行以下操作 tinyMCE execCommand mceInsertContent fa
  • 如何在c中创建一个n维数组

    我正在考虑编写一个函数 它接受 n 个参数并使用这些参数作为维度返回一个 n 维数组 现在我意识到一维和二维数组很容易用指针实现 对于二维数组 片段将类似于 标准方式 int x int temp x int malloc m sizeof