数组下标的那些事

1.大多数编程语言数组的下标为什么是从0开始?

从数组存储的内存模型来看,“下标”的确切定义应该是 “偏移”(offset)。

a[0]就是相对于首地址偏移为0的内存地址,a[k] 就是相对于首地址偏移k 个 type_size 的内存地址。
这样就能解释上篇提到的寻址公式:

a [k] _address = base_address + k * type_size

其实这也是一个大家认可度比较高的一种说法,也有人认为大多数编程语言下标从0开始是C语言的影响力造成的,由于C语言的普及人们习惯了下标从0开始的写法,所以之后的大多数语言下标索引仍然遵从从0开始。当然,也有一些下标不是从0开始的,比如matlab。

2.不常用索引方式

好像现在C语言也支持下标为负数的索引了,比如以下代码利用负数索引来赋值。

#include <stdio.h>
int main(){
    int a[3];
    for (int i = -1 ; i>=-3 ; i--) 
    {a[i] = i;

    printf("%d\n",a[i]);
    }
    return 0;
}

输出结果:

-1
-2
-3

这段代码执行起来是没毛病的,果然与时俱进啊,nice!
但是,产生负数下标索引的实际意义是是什么呢?
令人难以琢磨~

3.C编译不检查数组下标问题的恶心机制

#include<stdio.h>
int main(){
    int a[10];
    for(int i = 0; i < 10; i++){
        a [i] = i; //对数组赋值
        
    }
    a[10] = 10; 

    for(int j = 0; j <10; j++){
        printf("%d\n",a[j]);
    }

    printf("%d\n",a[10]);

    return 0;

}

对a[10]赋值不是越界的操作嘛,怎么还合法了呢?

还记得上篇中数组越界一个单位,会出现什么结果吗?想想为什么??

电子书推荐

---->「Pro+Git+第二版(中文版).pdf」
链接:https://www.aliyundrive.com/s/p7jC9BE8TRf

posted @   代码泥石流  阅读(296)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示