【专栏】数据结构和算法之美-为什么很多编程语言中的数组都是从 0 开始的

本文深入探讨了数组作为线性表的基本属性,如使用连续内存空间存储相同类型数据,这使得随机访问成为可能。对比了数组与链表的优缺点,如数组支持快速随机访问但插入删除效率低。同时,提醒开发者注意数组访问越界的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习笔记

  • 数组的特征
    1.线性表
    数据排成像一条线一样的结构,数据之间只是简单的前后关系。除了数组是一种线性表结构外,链表、队列和栈也是。与之对应的像二叉树、堆、图等就是非线性表。
    2.使用连续的内存空间
    3.存储相同类型数据
    特征2和3为随机访问到数组里的元素提供了可能,就是任意下标指示的元素可以直接访问到,寻址公式a[i]_address = base_address + i*data_type_size;

  • 数组和链表区别
    1.数组支持随机访问,根据下标随机访问的时间复杂度为O(1);
    2.数组低效的”插入“和”删除“,最好情况时间复杂度是O(1)、最坏情况时间复杂度是O(n)、平均时间复杂度是O(n).如果不考虑数组排序,要在数组K处插入元素时,只需要移动K处的元素到数组末尾,
    然后把新元素存放在K处。

  • 警惕数组的访问越界问题
    下面代码会陷入死循环,如果编译环境使用的堆栈,它的地址是从高地址向低地址方向增长,那么啊数组arr下标3位置的单元就是变量i,所以当for循环到第四次时,通过arr[3]=0 把变量i的值写成了0。

void iTestArrOutOfBoundary(void)
{
   int i = 0;
    int arr[3] = {0};
    for (; i <= 3; i++){
        arr[i] = 0; /*arr[3] = 0 means i = 0;*/
        printf("Hello world!\n");
    }
}
void main(void)
{
	iTestArrOutOfBoundary();
    return;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值