三、数组

本文深入探讨了数组作为线性表数据结构的特性,包括其连续内存存储方式和相同类型数据的特点,解释了数组在插入、删除操作上的低效性,并通过C语言示例展示了数组越界访问的问题。

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

一、概念

数组:数组是一种线性表数据结构。他用一组连续的内存空间,来存储一组相同类型的数据。根据概念延伸分析得,

1、根据数组的概念,延伸出一组概念,线性表非线性表

线性表:顾名思义,线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。如:数组、链表、队列、栈都是线性表结构。

非线性表:在非线性表中,数据之间的关系并不是简单的前后关系,比如:二叉树、堆、图

2、连续的内存空间 和 相同类型的数据

    这两个限制让数组实现的“随机访问”的特性。但这也让数组做很多操作变得非常低效。如下图:

分配一个长度为10的 int 类型的数组,其寻址可以通过下标 i 进行随机访问:

a[i]_address = base_address + data_type_size * i

 

二、特性

1、低效的“插入”和“删除”

    链表适合插入、删除,时间复杂度为O(1);

    数组适合查找,按照下标去查找的时间复杂度为O(1)。补充:通常有人会说,数组的查找时间复杂度为O(1),其实不准确,在排好序的数组中,用二分查找法查找的时间复杂度为O(logn)。

   如果想要在指定的下标处插入一个数据的话,不打破该数组中的其他变量之前的前后关系,保持数组的连续性。只要不是插入到该数组不是的最后一位,而是将数据插入到数组中间,都会让该下标后面的数据向后挪移。

   在数组中删除数据也是同理,保持数组的连续性,不出现空洞,只要不是删除最后一个数据,在数组中删除一个数据该下标后方的数据会向前挪移。

2、警惕数组的访问越界

    举一个数组越界的例子:

#include<stdio.h>

int main()
{
    int a[3] = {}; 
    int i = 0;
    for(i=0 ; i <= 3; i++)
    {   
        a[i] = 0;
        printf("hello world i:%d\n",i);
        printf("a[%d]:%p\n",i,a+i);
        printf("\n");
    }   

打印结果如下:

hello world i:0
a[0]:0xbf8f1e20

hello world i:1
a[1]:0xbf8f1e24

hello world i:2
a[2]:0xbf8f1e28

hello world i:0
a[0]:0xbf8f1e20

......无限重复

为什么会打印无数次的“hello world”?

    在C语言中只要不是访问受限的内存,所有的内存空间都是可以自由访问的。a[3]位置正好是存放变量 i 的存储地址的位置。所以a[3] = 0,就相当于又执行了一次 i=0。由以下程序可以证明:

#include<stdio.h>

int main()
{
    int a[3] = {}; 
    int i = 0;
    for(i=0 ; i <= 3; i++)
    {   
        a[i] = 1;
        printf("hello world i:%d\n",i);
        printf("a[%d]:%p\n",i,a+i);
        printf("\n");
    }   
}

执行结果如下:

hello world i:0
a[0]:0xbfd857a0

hello world i:1
a[1]:0xbfd857a4

hello world i:2
a[2]:0xbfd857a8

hello world i:1             //由于a[3]赋值为1,故 i 从 1循环开始
a[1]:0xbfd857a4

hello world i:2
a[2]:0xbfd857a8

hello world i:1
a[1]:0xbfd857a4

......反复循环

 

问题1:数组为什么从0开始?

答:数组下标代表的是偏移量,0就代表从第一个开始。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值