C语言:二维数组在内存中是怎么存储的

news/2025/2/25 23:03:08

目录

1. 二维数组的定义:

2. 行主序存储:

具体内存排列:

3. 如何通过指针访问数据:

4. 总结:


在 C 语言中,二维数组是按 行主序(row-major order) 存储的。也就是说,数组的每一行按顺序存储在内存中,所有行按顺序依次存放在内存的连续区域。

1. 二维数组的定义

假设有一个二维数组 axisData,它的定义如下:

float axisData[3][4];

这个数组有 3 行 4 列,总共有 12 个元素。二维数组 axisData内存中的存储方式如下:

2. 行主序存储

数组中的数据在内存中的存储顺序是按行存储的。也就是说,首先存储的是第一行的所有元素,然后是第二行,接着是第三行,依此类推。

对于数组 axisData[3][4],它在内存中的布局如下:

axisData[0][0], axisData[0][1], axisData[0][2], axisData[0][3],
axisData[1][0], axisData[1][1], axisData[1][2], axisData[1][3],
axisData[2][0], axisData[2][1], axisData[2][2], axisData[2][3]

具体内存排列:

假设 axisData内存中的起始地址为 0x1000,那么它的内存布局将是:

内存地址数据
0x1000axisData[0][0]
0x1004axisData[0][1]
0x1008axisData[0][2]
0x100CaxisData[0][3]
0x1010axisData[1][0]
0x1014axisData[1][1]
0x1018axisData[1][2]
0x101CaxisData[1][3]
0x1020axisData[2][0]
0x1024axisData[2][1]
0x1028axisData[2][2]
0x102CaxisData[2][3]

在这个例子中,数据 axisData[0][0]0x1000 地址上,axisData[0][1] 紧接着存储在 0x1004 地址上,依此类推,直到 axisData[2][3] 存储在 0x102C 地址上。

3. 如何通过指针访问数据

由于二维数组是按行主序存储的,因此我们可以通过指针偏移的方式访问数组元素。比如,给定 axisData[3][4] 数组的起始地址 &axisData[0][0],数组元素将按以下方式访问:

  • axisData[0][0]&axisData[0][0]
  • axisData[0][1]&axisData[0][0] + 1
  • axisData[0][2]&axisData[0][0] + 2
  • axisData[0][3]&axisData[0][0] + 3
  • axisData[1][0]&axisData[0][0] + 4
  • axisData[1][1]&axisData[0][0] + 5
  • ...

4. 总结

在 C 语言中,二维数组是按 行主序(row-major order) 存储的,即所有的行按照顺序连续存储在内存中。对于一个 mxn二维数组 arr[m][n],数组的第一个元素 arr[0][0] 存储在内存的起始位置,紧接着是 arr[0][1]arr[0][2] 等,直到 arr[0][n-1]。然后,存储的是 arr[1][0]arr[1][1],以此类推,直到 arr[m-1][n-1]


http://www.niftyadmin.cn/n/5866947.html

相关文章

微信小程序:完善购物车功能,购物车主页面展示,详细页面展示效果

一、效果图 1、主页面 根据物品信息进行菜单分类,点击单项购物车图标添加至购物车,记录总购物车数量 2、购物车详情页 根据主页面选择的项,根据后台查询展示到页面,可进行多选,数量加减等 二、代码 1、主页面 页…

Thinkphp6 安装Kafka扩展

安装PHP Kafka扩展 1、查询本机PHP版本信息 phpinfo() 查询信息,本机为PHP7.4.3,NTS 2、下载rdkafka扩展包 去rdkafka官网下载对应的扩展包,下载地址: https://pecl.php.net/package/rdkafka 下载对应的扩展包 3、配置服务 解压后&…

详细解析d3dx9_27.dll丢失怎么办?如何快速修复d3dx9_27.dll

运行程序时提示“d3dx9_27.dll文件缺失”,通常由DirectX组件损坏或文件丢失引起。此问题可通过系统化修复方法解决,无需重装系统或软件。下文将详细说明具体步骤及注意事项。 一.d3dx9_27.dll缺失问题的本质解析 当系统提示“d3dx9_27.dll丢失”时&…

Web to App:从 0 到 1,打造高效的 App 增长闭环

各位开发者朋友们,大家好!我们专注于移动端的增长。今天跟大家分享一个非常实用的技术方案:Web to App。 Web to App,顾名思义,就是将 Web 端的流量引导至 App 端,从而实现用户增长。 这种方案在很多场景下…

Pytorch实现基于GAN的无监督图像纹理特征传输训练自己的数据集

简介 简介:利用Unet架构来构建生成器模型输出纹理特征图像,并设计了VGG19模型架构来构建纹理损失。利用多个低级VGG19的特征层计算均值和方差,并得到生成的纹理与真实纹理的差异性。并结合L1损失、对抗损失等共同训练。 论文题目:Unsupersived Image Texture Transfer Ba…

大模型WebUI:Gradio全解12——LangChain原理及其agent构建Gradio(1)

大模型WebUI:Gradio全解12——LangChain原理及其agent构建Gradio(1) 前言本篇摘要12. LangChain原理及其agent构建Gradio12.1 LangChain概念及优势分析12.1.1 概念12.1.2 标准化组件接口1. 示例:聊天模型2. 示例:检索器12.1.3 编排组件12.1.4 便于部署12.1.5 可观测性和评…

Http模块及练习

### 作业 1. 静态文件服务器 js const http await import(http) const fs await import(fs) const proc ((req,res)>{ let file ./public${req.url} let FilePath file.replace(favicon.ico,"") // 检查文件是否存在 if (!fs.existsSync(FilePa…

STM32基础篇(三)------滴答定时器

滴答定时器简介 SysTick定时器(STK) 处理器有一个24位系统定时器SysTick,它从重新加载值倒计时到零,在下一个时钟沿重新加载(换行)LOAD寄存器中的值,然后对后续时钟倒计时。当处理器暂停调试时&…