user-0 提问: 弱弱的问一句，内存中，数组是按行存储还是按列存储？

回复:
user: user-1
content: 按行存储。。。

user: user-2
content: 引用 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)

user: user-3
content: 引用 4 楼 luozikuan 的回复:C++的vector吗？它是一个封装好的结构，应该不是简单的数组，要动态增长的话，本能地是想到链式存储。 vector是利用动态数组，元素增加了以后就要自动去扩大数组容量了，然后再复制过去。

user: user-2
content: 对于Fortran integer a[N0][N1]....[Ni]; 对于 Fortran  integer a（N0,N1,....,Ni)

user: user-2
content: 引用 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 变化最慢   这个就是编程语言的数组内存布局的行优先和列优先的区别。  这种区别，对于两种语言的函数过程，互相调用的时候，就需要特别注意。 通常，只使用某种语言，是没有问题的。

user: user-4
content: 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-4
content: 引用 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 //

user: user-5
content: 内存是平坦的 所以,就算是外星来的开发软件 存储永远是按行存储的  如果你一定认为有按列储存的 请把数据阵列向右或向左旋转90度来看

user: user-0
content: 引用 16 楼 zhao4zhong1 的回复:一维数组何来按行按列存储？ 二维数组才有按行按列存储。但vector < vector <> >个人认为根本不是二维数组。 这里不是几维的问题，就是如何访问vector中结构体元素的数据，数据成员都是int型的

user: user-6
content: C/C++的数組并不存在所谓行和列的概念，这种自我杜撰出来的东西是国内烂书的又一项自以为是的“发明“，用这种方式去理解数組是有害的，正是由于这种破烂概念的存在才出现了楼主这种本不应该出现的疑问，可谓害人不浅。

user: user-4
content: 一维数组何来按行按列存储？ 二维数组才有按行按列存储。但vector < vector <> >个人认为根本不是二维数组。

user: user-2
content: C++的 vector 是动态的一维数组，所以没有行列的概念。

user: user-2
content: 各个编程语言里，只有二维数组，才有行和列的概念。 因为有时用二维数组，表示矩阵。  至于多维数组，哪个维度算列，哪个算行？？？已经无法用行列来表示了。 而一维数组，可以当作列，也可以当作行。  只有二维数组，有清晰的行列概念。因为他和矩阵的概念对应，数组的行和列，对应矩阵的行和列。  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 每列数据中的每一行，是一个挨着一个的。

user: user-7
content: 某书说到是多维数组是先行后列存储。 用vs启动调试也可以看出。   int main() { 	char x[][5] = { "hello", "world" }; 	return 0;	 }     x[1]的地址总是从x[0]的地址偏移五个字节。也就是先存储x[0]中的五个字符，再存储x[1]的五个字符。

user: user-0
content: 引用 10 楼 baichi4141 的回复:指针执行+时，按指针指向类型的大小计算偏移 如果一个结构体大小为100，那么指向这个结构体的指针执行++时，偏移100字节，执行+3时，偏移300字节 至于按行存储和按列存储，那纯属画图时的方向问题 你这里只是找到某个结构体的首地址，可是我还要找到这个结构体里的数据成员的具体地址，这样才能访问到数据啊

user: user-0
content: 最终问题可以归纳为这样，vector在内存的存储，是存完一个结构体，接着存下一个结构体，按这样来理解是不是可以认为是按列存储的，然而我在用地址偏移的时候却发现按行来偏移的

user: user-8
content: 指针执行+时，按指针指向类型的大小计算偏移 如果一个结构体大小为100，那么指向这个结构体的指针执行++时，偏移100字节，执行+3时，偏移300字节 至于按行存储和按列存储，那纯属画图时的方向问题

user: user-0
content: 我知道vector有多维的，但我这里只是问一维的vector，7楼没明白我的意思，我的意思是这样的，有一个一维的vector，其元素为结构体，结构体数据都是int型的，我想访问用指针方法访问结构体里的数据

user: user-9
content: 动态数组不也是数组吗

user: user-10
content: 引用 5 楼 micklexqg 的回复:[quote=引用 3 楼 zhuobattle 的回复:] [quote=引用 2 楼 micklexqg 的回复:] [quote=引用 1 楼 luozikuan 的回复:] 不同的语言有不同的规定，C是按行存，FORTRAN按列存。 vector是怎么存储的呢？[/quote] vector就是数组。[/quote] 那这么来说也是按行存储的了[/quote] vector不是多维的，有啥行和列？ 再说了，行和列只是业务逻辑，你认为第几维是行，它就是行。 就我自己来讲，平时从来不用多维数组。多维数据写个包装类，存在一维的vector里面。