数组下标的那些事
作者:互联网
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
标签:10,下标,int,C语言,那些,索引,标的,数组 来源: https://www.cnblogs.com/mmzwx/p/15860276.html