[开发工具] C语言的数组的下标可以是负数

[复制链接]
833|1
 楼主| OKAKAKO 发表于 2024-5-24 11:12 | 显示全部楼层 |阅读模式

C语言中使用数组,一般来说都是这样的:

  1. int ary[5] = {1, 2, 3, 4, 5};
  2. ary[0] = 10;


语法规定,数组的长度必须是个常量,保证数组所占的内存大小不变。

数组下标从 0 开始,依次往后递增。

于是大部分同学都把它当作了默认的规则。

其实,数组的长度可以是0,叫做柔性数组,目的是让结构体变成可变长度,不过也是使用 malloc 进行空间的申请。

另外,数组的下标也可以是负数,正数表示向后访问,负数表示向前访问。

比如:

  1. int ary[5] = {1, 2, 3, 4, 5};
  2. int *p = &ary[2];
  3. p[-2] = 0;


如果不太明白,可以看下下面的内存示意图:

1.png

对于二维数组,同样可以使用负数的下标来访问元素。
  1. int ary[3][3] = {{1, 2, 3}, {2, 3, 4}, {3, 4, 5}};
  2. int (*p)[3] = ary + 2;
  3. printf(" %d\n ", p[-1][-1]);

指针p指向数组的第三行,p[-1]表示第二行的首元素地址,p[-1][-1]表示第二行首元素的前面一个元素,即第一行最后一个元素
注意:二维数组在内存中也是连续的。
2.png

使用负数作为下标来访问数组,切记内存不要越界,访问的内存一定是存在的,否则肯定有可能导致程序崩溃
聪明的同学应该也能发现,这个所谓的负数其实只是指针的加减运算而已,坦白说并没有什么用。

jf101 发表于 2024-6-23 14:41 | 显示全部楼层
原理很清晰,但实际确实很少用负数进行编程
您需要登录后才可以回帖 登录 | 注册

本版积分规则

260

主题

2096

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部