弱弱的问一句,内存中,数组是按行存储还是按列存储?

micklexqg 2014-01-02 09:23:27
如题,内存中,数组是按行存储还是按列存储?
...全文
1520 32 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jimmy1224 2014-01-06
  • 打赏
  • 举报
回复
按行存储。。。
lm_whales 2014-01-04
  • 打赏
  • 举报
回复
引用 14 楼 lm_whales 的回复:
integer a dimesion a(5,4) data a / 1,2,3,4,5 ,2,3,4,5,6 , 3,4,5,6,7 ,4,5,6,7,8 / 这是一个5 行4列的二维数组 下面是内存布局,和C语言4行5列的二维数组,内存布局完全一致。 //第 1(0),2(1),3(2),4(3),5(4) 行数据 {1 ,2 ,3 ,4 ,5 }, //第1(0)列 5个元素 ,即有5行 {2 ,3 ,4 ,5 ,6 }, //第2(1)列 5个元素 ,即有5行 {3 ,4 ,5 ,6 ,7 }, //第3(2)列 5个元素 ,即有5行 {4 ,5 ,6 ,7 ,8 }, //第4(3)列 5个元素 ,即有5行
dimesion a(5:4)改成dimesion a(5,4)
Morrisss_ 2014-01-03
  • 打赏
  • 举报
回复
引用 4 楼 luozikuan 的回复:
C++的vector吗?它是一个封装好的结构,应该不是简单的数组,要动态增长的话,本能地是想到链式存储。
vector是利用动态数组,元素增加了以后就要自动去扩大数组容量了,然后再复制过去。
lm_whales 2014-01-03
  • 打赏
  • 举报
回复
对于Fortran integer a[N0][N1]....[Ni]; 对于 Fortran integer a(N0,N1,....,Ni)
lm_whales 2014-01-03
  • 打赏
  • 举报
回复
引用 19 楼 gz_qmc 的回复:
内存是平坦的 所以,就算是外星来的开发软件 存储永远是按行存储的 如果你一定认为有按列储存的 请把数据阵列向右或向左旋转90度来看
其实就是先数哪个下标的问题。 C 下标 是从左到右数数,最后一个下标变化最快。即最右边的下标,变化最快。 Fortran 是是从右到左数数,,最后一个下标变化最快。即最左边的下标,变化最快。 对于C int a[N0][N1]....[Ni]; 从内存中第0~ 到第 ΠNi 个数据数数, 假设下标是 n0,n1,。。。。ni 那么 下标 ni 变化最快,n0 变化最慢 对于 Fortran integer a[N0][N1]....[Ni]; 从内存中第0~ 到第 ΠNi 个数据数数, 假设下标是 n0,n1,。。。。ni 那么 下标 n0 变化最快,ni 变化最慢 这个就是编程语言的数组内存布局的行优先和列优先的区别。 这种区别,对于两种语言的函数过程,互相调用的时候,就需要特别注意。 通常,只使用某种语言,是没有问题的。
赵4老师 2014-01-02
  • 打赏
  • 举报
回复
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
赵4老师 2014-01-02
  • 打赏
  • 举报
回复
引用 18 楼 micklexqg 的回复:
[quote=引用 16 楼 zhao4zhong1 的回复:] 一维数组何来按行按列存储? 二维数组才有按行按列存储。但vector < vector <> >个人认为根本不是二维数组。
这里不是几维的问题,就是如何访问vector中结构体元素的数据,数据成员都是int型的[/quote]
#include <iostream>
#include <vector>
using namespace std;
struct MY_S {
 int d0;
 int d1;
};
typedef struct MY_S MY_STRUCT;
vector <MY_STRUCT> my_structs(2);
int main() {
    my_structs[0].d0=10;
    my_structs[0].d1=11;
    my_structs[1].d0=20;
    my_structs[1].d1=21;
    cout<<my_structs[0].d0<<endl;
    cout<<my_structs[0].d1<<endl;
    cout<<my_structs[1].d0<<endl;
    cout<<my_structs[1].d1<<endl;
    return 0;
}
//10
//11
//20
//21
//
gz_qmc 2014-01-02
  • 打赏
  • 举报
回复
内存是平坦的 所以,就算是外星来的开发软件 存储永远是按行存储的 如果你一定认为有按列储存的 请把数据阵列向右或向左旋转90度来看
micklexqg 2014-01-02
  • 打赏
  • 举报
回复
引用 16 楼 zhao4zhong1 的回复:
一维数组何来按行按列存储? 二维数组才有按行按列存储。但vector < vector <> >个人认为根本不是二维数组。
这里不是几维的问题,就是如何访问vector中结构体元素的数据,数据成员都是int型的
飞天御剑流 2014-01-02
  • 打赏
  • 举报
回复
C/C++的数組并不存在所谓行和列的概念,这种自我杜撰出来的东西是国内烂书的又一项自以为是的“发明“,用这种方式去理解数組是有害的,正是由于这种破烂概念的存在才出现了楼主这种本不应该出现的疑问,可谓害人不浅。
赵4老师 2014-01-02
  • 打赏
  • 举报
回复
一维数组何来按行按列存储? 二维数组才有按行按列存储。但vector < vector <> >个人认为根本不是二维数组。
lm_whales 2014-01-02
  • 打赏
  • 举报
回复
C++的 vector 是动态的一维数组,所以没有行列的概念。
lm_whales 2014-01-02
  • 打赏
  • 举报
回复
各个编程语言里,只有二维数组,才有行和列的概念。 因为有时用二维数组,表示矩阵。 至于多维数组,哪个维度算列,哪个算行???已经无法用行列来表示了。 而一维数组,可以当作列,也可以当作行。 只有二维数组,有清晰的行列概念。因为他和矩阵的概念对应,数组的行和列,对应矩阵的行和列。 C 行优先,各列数据,在每一行里,一个挨着一个排列。 数据是一行一行的,每行是连续排列的若干元素。 下面是个4行5列的二维数组: 注释里 小括号里是,C常用的索引方式,从0开始计数。 小括号外面是通常的方式,从1开始计数。 int a[4][5]={ //第 1(0),2(1),3(2),4(3),5(4) 列数据 {1 ,2 ,3 ,4 ,5 }, //第1(0)行 5个元素 ,即有5列 {2 ,3 ,4 ,5 ,6 }, //第2(1)行 5个元素 ,即有5列 {3 ,4 ,5 ,6 ,7 }, //第3(2)行 5个元素 ,即有5列 {4 ,5 ,6 ,7 ,8 }, //第4(3)行 5个元素 ,即有5列 }; Fortran 列优先 每行数据,在每一列里一个挨着一个排列。 integer a; dimesion a(5:4) data a / 1,2,3,4,5 ,2,3,4,5,6 , 3,4,5,6,7 ,4,5,6,7,8 / 这是一个5 行4列的二维数组 下面是内存布局,和C语言4行5列的二维数组,内存布局完全一致。 //第 1(0),2(1),3(2),4(3),5(4) 行数据 {1 ,2 ,3 ,4 ,5 }, //第1(0)列 5个元素 ,即有5行 {2 ,3 ,4 ,5 ,6 }, //第2(1)列 5个元素 ,即有5行 {3 ,4 ,5 ,6 ,7 }, //第3(2)列 5个元素 ,即有5行 {4 ,5 ,6 ,7 ,8 }, //第4(3)列 5个元素 ,即有5行 所不同的是,行和列的意义,两种语言完全不同。 注意两种语言的下标的意义,完全相同,行列的意义却不同。 第一个下标,称作行,第二个下标称作列。这个在两种语言中没有区别。 内存布局则不同 C每行数据中的每一列,是一个挨着一个的。 Fortran 每列数据中的每一行,是一个挨着一个的。
F_U_C_K_GFW 2014-01-02
  • 打赏
  • 举报
回复
某书说到是多维数组是先行后列存储。
用vs启动调试也可以看出。


int main()
{
char x[][5] = { "hello", "world" };
return 0;
}




x[1]的地址总是从x[0]的地址偏移五个字节。也就是先存储x[0]中的五个字符,再存储x[1]的五个字符。
micklexqg 2014-01-02
  • 打赏
  • 举报
回复
引用 10 楼 baichi4141 的回复:
指针执行+时,按指针指向类型的大小计算偏移 如果一个结构体大小为100,那么指向这个结构体的指针执行++时,偏移100字节,执行+3时,偏移300字节 至于按行存储和按列存储,那纯属画图时的方向问题
你这里只是找到某个结构体的首地址,可是我还要找到这个结构体里的数据成员的具体地址,这样才能访问到数据啊
micklexqg 2014-01-02
  • 打赏
  • 举报
回复
最终问题可以归纳为这样,vector在内存的存储,是存完一个结构体,接着存下一个结构体,按这样来理解是不是可以认为是按列存储的,然而我在用地址偏移的时候却发现按行来偏移的
baichi4141 2014-01-02
  • 打赏
  • 举报
回复
指针执行+时,按指针指向类型的大小计算偏移 如果一个结构体大小为100,那么指向这个结构体的指针执行++时,偏移100字节,执行+3时,偏移300字节 至于按行存储和按列存储,那纯属画图时的方向问题
micklexqg 2014-01-02
  • 打赏
  • 举报
回复
我知道vector有多维的,但我这里只是问一维的vector,7楼没明白我的意思,我的意思是这样的,有一个一维的vector,其元素为结构体,结构体数据都是int型的,我想访问用指针方法访问结构体里的数据
Bird_1989 2014-01-02
  • 打赏
  • 举报
回复
动态数组不也是数组吗
jiandingzhe 2014-01-02
  • 打赏
  • 举报
回复
引用 5 楼 micklexqg 的回复:
[quote=引用 3 楼 zhuobattle 的回复:] [quote=引用 2 楼 micklexqg 的回复:] [quote=引用 1 楼 luozikuan 的回复:] 不同的语言有不同的规定,C是按行存,FORTRAN按列存。
vector是怎么存储的呢?[/quote] vector就是数组。[/quote] 那这么来说也是按行存储的了[/quote] vector不是多维的,有啥行和列? 再说了,行和列只是业务逻辑,你认为第几维是行,它就是行。 就我自己来讲,平时从来不用多维数组。多维数据写个包装类,存在一维的vector里面。
加载更多回复(12)
在CAD(计算机辅助设计)软件,线性是构建采矿工程图的重要元素。"cad采矿用各种线性"指的是在CAD环境下,为了精确地表示采矿工程的地质结构、开采路径、巷道布局等,所使用的一系列特定线型。这些线型通常包括连续线、虚线、点划线以及定制的特殊线型,以便清晰地标识不同类型的地质特征、开采边界和安全区域。 线型在CAD起到区分和标识不同对象的作用。例如,连续线可能用于表示巷道的实际走向,虚线可能用于表示规划的巷道或尚未施工的部分,点划线则可能用于显示支撑结构或危险区域。通过选择合适的线型,工程师们可以更直观地理解采矿工程的设计和进度。 `.lin`文件是CAD的线型文件,它包含了线型的定义。用户可以自定义线型,如设置线型的比例因子、每个线段的长度和间隔,以及它们的组合方式。`.lin`文件可以被CAD软件读取,使得用户在绘图时能够选择并应用这些预定义的线型。 `.shp`和`.shx`文件则是与CAD的形状文件相关的。`.shp`文件是一种存储地理空间数据的标准格式,通常包含几何对象(如点、线和多边形)的信息。在采矿领域,这些文件可能用于表示矿体的边界、巷道的位置或其他地质特征。`.shx`文件是`.shp`文件的索引,用于快速访和处理数据,提高软件的性能。 结合这些文件,我们可以创建一个全面的采矿工程图,其包括了各种定制的线性表示,使设计和分析工作更为准确高效。在实际操作,工程师首先会根据需求定义或导入`.lin`文件,然后在绘制巷道、矿体和其他元素时选择相应的线型。同时,他们会利用`.shp`和`.shx`文件来加载和管理地理空间数据,以便在CAD环境呈现采矿区域的三维视图和二维平面图。 通过熟练掌握CAD的线性操作,采矿工程师能够更好地进行规划、模拟和沟通,确保采矿作业的安全性和经济性。此外,这些技术也可以应用于其他工程领域,如土木工程、地质调查等,因为线型的使用是通用的,旨在提供清晰的视觉表示和专业信息的传递。因此,深入理解和应用CAD的线性是现代工程设计不可或缺的一部分。
资源下载链接为: https://pan.quark.cn/s/f989b9092fc5 以下是关于“LUST文操作手册-s.pdf”文档的知识点解析: 标题与描述:文档标题为“LUST文操作手册-s.pdf”,从标题来看,这是一份关于LUST系统的文操作手册,其描述与标题相同,推测是直接以文件名作为描述。 标签:“11”可能是手册的章节编号或特定功能模块编号,需结合文档内容确定具体含义。 内容分析:手册涉及LUST系统的多个方面,如伺服控制、系统配置、参数设置等。以下是详细解析: 1.1部分:介绍LUST系统的基本概念或功能特性。提到夜晚的概念,可能指系统工作环境或某种工作模式;还涉及操作或配置命令,以及电源或供电部分,如230V/460V电压等级,推测在介绍硬件基础配置。 2.1至2.2.2部分:涉及系统内部功能模块,包括驱动控制等。提到驱动器或控制器的电源部分,以及具体的配置步骤或参数设置指南。 4部分:提到伺服控制系统(ServoC),是手册的重要内容之一。详细介绍了如何配置和使用伺服控制系统,包括不同配置步骤或使用场景。 3部分:关于系统的总体配置或设置指南。可能提供了系统核心组件或主要配置项的设定方法。 5.1至5.2.3部分:涉及系统的工作原理或操作流程。可能详细介绍了系统的具体工作流程或操作模式。 6部分:介绍LUST系统某个特定功能模块的操作指南,例如高级设置或特定应用场景下的操作指导。 7.1至7.3.4部分:涉及系统的配置管理或特定组件的使用指南,详细介绍了配置管理的不同方面,包括配置工具的使用、特定组件的配置指南等。 8.1至8.5.1部分:涵盖系统的其他高级功能或特定应用场景下的操作指南。 综上所述,LUST系统是一套复杂的自动化控制系统,涉及伺服控制、系统配置等多个方面。该手册详细地介绍了如何使用和配置这套系统,是用户宝贵的参考资料。

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧