01 数组的下标可以是负数
C语言中使用数组,一般来说都是这样的:
int ary[5] = {1, 2, 3, 4, 5};
ary[0] = 10;
语法规定,数组的长度必须是个常量,保证数组所占的内存大小不变。
数组下标从 0 开始,依次往后递增。
于是大部分同学都把它当作了默认的规则。
其实,数组的长度可以是0,叫做柔性数组,目的是让结构体变成可变长度,不过也是使用 malloc 进行空间的申请。
另外,数组的下标也可以是负数,正数表示向后访问,负数表示向前访问。
比如:
int ary[5] = {1, 2, 3, 4, 5};
int *p = &ary[2];
p[-2] = 0;
如果不太明白,可以看下下面的内存示意图:
对于二维数组,同样可以使用负数的下标来访问元素。
int ary[3][3] = {
{1, 2, 3}, {2, 3, 4}, {3, 4, 5}};
int (*p)[3] = ary + 2;
printf(" %d\n ", p[-1][-1]);
指针p指向数组的第三行,p[-1]表示第二行