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]表示第二行的首元素地址,p[-1][-1]表示第二行首元素的前面一个元素,即第一行最后一个元素
注意:二维数组在内存中也是连续的。
使用负数作为下标来访问数组,切记内存不要越界,访问的内存一定是存在的,否则肯定有可能导致程序崩溃
聪明的同学应该也能发现,这个所谓的负数其实只是指针的加减运算而已,坦白说并没有什么用。
|