数据结构与算法学习:数组

今天我们开始学习最基本,最简单的数据类型:数组;它是一种线性数据结构。具有一组连续的内存空间来存储相同数据类型的结构。
在这里插入图片描述

数据越界问题思考:
分析下面的代码,栈是由高到低位增长的,所以,i和数组的数据从高位地址到低位地址依次是:i, a[2], a[1], a[0]。a[3]通过寻址公式,计算得到地址正好是i的存储地址,所以a[3]=0,就相当于i=0,从而for循环中改写了i的数值,导致死循环。

int main(int argc, char* argv[]){
    int i = 0;
    int arr[3] = {0};
    for(; i<=3; i++){
        arr[i] = 0;
        printf("hello world\n");
    }
    return 0;
}

为什么数组下标从0开始,而不是从1开始?
从0开始,第K个数据地址:

a[k]_address = base_address + k * type_size

从1开始,第K个数据地址:

a[k]_address = base_address + (k-1) * type_size

对比两个公式,我们不难发现,从 1 开始编号,每次随机访问数组的元素都多了一次减法操作。
课后习题:
1、JVM标记清除算法
“标记-清除”算法,如它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。之所以说它是最基础的收集算法,是因为后续的收集算法都是基于这种思路并对其缺点进行改进而得到的。
它的主要缺点有两个:
(1)效率问题:标记和清除过程的效率都不高;
(2)空间问题:标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致,碎片过多会导致大对象无法分配到足够的连续内存,从而不得不提前触发GC,甚至Stop The World。
在这里插入图片描述
https://blog.csdn.net/wuzhiwei549/article/details/80563134
2、二维数组寻址方式:a[m][n]

a[i][k]_address = base_address + (i*n + k) * type_size

猜你喜欢

转载自blog.csdn.net/jsh13417/article/details/82961275
今日推荐