数组在内存中如何存储( 二 )


实际的数组元素被存储在堆(heap)内存中;数组引用变量是一个引用类型的变量, 被存储在栈(stack)内存中.
一维数组在内存中的存放方式是怎么样的? 因为你的a[M][N]有12个元素, 所以end-begin(即p-a[0])肯定恒为11 。 因为指针相减的结果是元素差而不是地址差 。 比如若有int a[3]={1,2,3};则&a[1]-&a[0]=1, 而它们的地址值却相差4 。 在内存中无论几维数组, 都是按一维数组存放的 。 比如二维数组, 第一行最后一个元素后就紧接着第二行的第一个元素, 依此类推 。 这也是多维数组都可以降维为一维数组来处理的原因 。
c语言程序中, 定义几个字符数组, 在内存中是怎么存储的? 严格意义上说不存在二维数组, 只是数组里的每个元素是一个一维数组, 而内存是一段连续的空间, 根据你申请一个变量的顺序按地址从低到高排, 所以二维数组不可能像一个矩阵那样在内存中排列, 这就涉及到它是按行依次往下排, 还是按列往下排, 而在c++中是按行, 既 int a[2][2]
a[0][0]
a[0][1]
a[1][0]
a[1][1]
c语言中二维数组在内存中怎样存储? 整型数组每个元素在内存中连续存储, 每个整型元素存储方式取决于机器硬件 。
一、数组元素都是连续存储的, 地址依次从低到高 。
如字符数组 char a[10];
其元素有10个, 为a[0]到a[9], 地址连续 。 如果a的起始地址为0x1234,那么后续地址依次为0x1235, 0x1235...0x123D 。
二、每个元素具体存储方式, 取决于CPU 。 有两种:
1、小端(Little Endian):
将低序字节存储在起始地址(低位编址), 地址低位存储值的低位, 地址高位存储值的高位 。
目前大多数CPU是按照这种方式存储的, 包括intel和移动端最常见的arm 。
比如4字节整型值为0x12345678的情况, 那么在内存中会存储为:

0x78 0x56 0x34 0x12
2、大端(Big Endian):
与小端相反, 将高序字节存储在起始地址(高位编址), 地址低位存储值的高位,地址高位存储值的低位 。
之前的例子在大端情况下存储为:
0x12 0x34 0x56 0x78
数组在内存中如何存储, 存放哪些信息 。 二维数组在内存中是如何存储的, 这不是一定的, 具体要看编译系统是如何规定的 。
对于多数编译系统而言, 都是采用“行优先”的策略, 比如一个int a[5][3]数组, 它是从首地址开始依次是a[0][0], a[0][1], a[0][2], 然后是a[1][0], a[1][1], a[1][2], …… 。 直到最后是a[4][0], a[4][1], a[4][2] 。

推荐阅读