《数组》
《数组的分配与访问》
首先我们要知道在8086中内存的结构如图:
可见一个单元格有8bit(1B)
对于指针类型数据占4字节,char占1个字节,int 占 4个字节,short 占2个字节,double 占8个字节
当我们访问数组中的数据时是要访存的,当要访存时,我们只知道数组的首地址和数据下标i
那么我们如何寻找在内存中我们所需要的数据呢?
如图所示,这里我想要强调的是:
假设一个int 型的数组,知道首地址为0100H ,那么 [1] 中的数据在哪个地址?
0100H + 1 * 4(注意要转化为16进制) = 0104H
《在静态区中的分配》
因为buf数组定义在外面,则在编译后其在数据段中,而不在堆栈
通过反汇编可以知道buf 在数据段中的地址:08048908
其后为数组中的数据:
因为int 占 4B 即 32位,则可以知道 0A 00 00 00 为 10的数据表示
因为一个内存中的单元格有8位(一个字节),所以这里8位8位地一个分开,
所以有 0A 00 00 00 这样
因为其是小端模式,则真正看的话是: 00 00 00 0A
《在堆栈中的分配》
《数组与指针的关系》
定义int a[]
注意:我们平时中写代码中对指针 的+1 操作在编译过后会解释成 + 1* (指针指向的数据的大小)
如 int * ptr; ptr+=1
那么其实是: add $4,ptr
还有:
我们在A[0],A[i].....等操作都是要访存的,用mov指令
而*(xxx) 操作是要取地址,用lea指令
《多维数组与指针数组的关系》
我们来分析一下:
通过:
我们可以看到其实二维数组中也是直接保存了数据
再通过:
其实二维数组 int num[][] 中的第一维相当于 int * num[],即指针数组
这个时候会想:指针数组中岂不是每一个元素都指向一个数据的地址吗?
咋指针数组还可以指向一个数组呢?
对的,指针指向了数组中第一个元素的地址
然后其他的数据需要下标来确定,没有下标,指针还真就是只能指向一个数据的地址
这也就是为什么我们在定义二维数组时可以定义为 int arr[][n] ,而不能是 int arr[n][]
其中的n就是用来判断这个一个指针中指向的数组,到底有多少个元素
标签:计算机系统,00,字节,int,联合体,----,数组,数据,指针 From: https://www.cnblogs.com/cilinmengye/p/17375540.html