数组的下标为什么可以是负数

描述

最近有同学发来这样一段代码,并提出一个问题,数组的下标为什么可以是负数?

 

 

#include 


int main()
{
    const char *s = "helloworld";
    const char *p = s + 5;


    printf("%c
", p[-2]);


    return 0;
}

 

 

关键是这段代码,编译运行都很顺利。

首先需要搞懂下标的作用是什么,准确的说,它是个偏移量。

比如 a[3],数组名 a 作为数组首元素地址,下标 3 表示从这个地址开始向后移动 3 个元素,至于具体是几个字节,得看什么元素。

所以 a[3] 完全等价于 *(a + 3),甚至把代码写成 3[a] 编译器也没意见,表示的都是一个意思。

如果把数组下标写成负数,就表示向前偏移。

a[-1] 就是向前偏移一个元素,很显然,前面这块内存不属于数组,不能这样使用,所以很少见到数组下标是负数的。

但是对于这样精心设计过的代码,保证内存不会越界的情况下,完全没有问题。

s 指向了字符 h,p 指向了字符 w,p[-2] 就是往前数两个元素,所以打印出来的就是 l。
 

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分