打印
[开发工具]

C语言的数组的下标可以是负数

[复制链接]
208|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
OKAKAKO|  楼主 | 2024-5-24 11:12 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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]表示第二行首元素的前面一个元素,即第一行最后一个元素
注意:二维数组在内存中也是连续的。


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

使用特权

评论回复
沙发
jf101| | 2024-5-24 14:41 | 只看该作者
原理很清晰,但实际确实很少用负数进行编程

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

162

主题

1179

帖子

3

粉丝