0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

学益得智能硬件 来源:学益得智能硬件 2024-12-20 11:18 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

#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。

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

    关注

    30

    文章

    4941

    浏览量

    73150
  • 数组
    +关注

    关注

    1

    文章

    420

    浏览量

    27114

原文标题:数组的下标可不可以是负数

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    scanf函数介绍

    \", a));正确 数组元素可使用的最大下标 int i,a[10]={1}; for(i=1;i<=10;i++) printf(%d\",a); 错误 int
    发表于 12-02 06:07

    数组的初体验

    程序中也需要容器,只不过该容器有点特殊,它在程序中是一块连续的,大小固定并且里面的数据类型一致的内存空间,它还有个好听的名字叫数组可以数组理解为大小固定,所放物品为同类的一个购物袋,在该购 物
    发表于 11-25 08:06

    二维数组介绍

    大家不要认为二维数组在内存中就是按行、列这样二维存储的,实际上,不管二维、三维数组… 都是编译器的语法糖。 存储上和一维数组没有本质区别,举个例子: int array[3][3
    发表于 11-25 07:42

    ++和--运算时数据在正数时计算是正确的,负数时有时候会溜掉计数,为什么?

    ,稍微快点的时候数值如果是正数时正反转都没问题,计算得到的值也是正确的,但是到了负数区就出现计数不准的情况,感觉像是漏掉计数一样,数值会越来越大。
    发表于 06-23 07:25

    在CCG3PA datasheet上看到LVTTL input, VDDD&lt;2.7V,是不是说CCG3PA IO/I2C可以是1.8V电平的?

    我在CCG3PA datasheet上看到LVTTL input, VDDD&lt;2.7V,是不是说CCG3PA IO/I2C可以是1.8V电平的? 如果是的话,此时芯片供电来自于VBUS_IN ? VDDD供1.8V吗?
    发表于 06-03 10:01

    stm32 DMA串口接收到数组数组元素顺序错乱怎么解决?

    配置DMA循环模式,使用HAL_UART_Receive_DMA(&huart1,buffer,4)函数将串口数据循环发送到4个元素的buffer数组内,上位机20ms发送一次
    发表于 03-12 08:02

    给uint32_t数组填充整型值,除使用循环赋值外有没有c库函数可以实现?

    给uint32_t数组填充整型值,除使用循环赋值外有没有c库函数可以实现
    发表于 03-07 17:05

    原创:labview 读取补码表示的有符号16位数时,如何解析成负数

    二进制表示的,负值用二进制表示时,是以补码的形式表示。 (正数的补码是其本身,负数的补码是符号位不变,其他位取反再加1) 2、读取到用补码表示的负值后,显示在PC屏幕上的数字是一个正数(例如32位数
    发表于 02-21 22:12

    ADS1298负数的编码,应该怎么处理?

    由于是送到TFT屏上显示,没做过负的显示。ADS1298是24位,而常见的都是32和16位,我要同时显示正负数,关于负数的编码,应该怎么处理?
    发表于 02-12 07:59

    请问PCM4222(AIN+)-(AIN-)的输入范围可以是负电压吗?

    请问PCM4222(AIN+)-(AIN-)的输入范围可以是负电压吗?
    发表于 02-10 07:46

    DAC161S997EVM LOOP(J1)最大电压可以是多少?可以加个24V电压吗?

    DAC161S997EVMLOOP(J1)最大电压可以是多少?可以加个24V电压吗?
    发表于 01-23 08:14

    ADS5842如何接入和设置?参考电压源最低可以是多少?

    如何接入和设置?参考电压源最低可以是多少?当低于推荐时1.2V时,对器件性能有什么影响?
    发表于 01-14 08:35

    请问TI有哪款DA转换器的参考源可以是交流(2khz~20khz)正弦信号的吗?

    请问TI有哪款DA转换器的参考源可以是交流(2khz~20khz)正弦信号的吗?我的一个项目里是要用DA产生可变的交流模拟量,希望输出的交流信号和参考源的交流信号之间相移不超过5度。
    发表于 12-25 06:59

    使用ADS8341时,其COM脚可以接负电压吗,最大可以是多少?

    各位好,想请教一下使用ADS8341时,其COM脚可以接负电压吗,最大可以是多少?比如如果接-2V会不会有问题(Vref接4V),谢谢!
    发表于 12-17 07:32

    SN74CBTLV3257输入是1.8v,输出是否可以是3.3v, 上拉电阻是3.3v?

    像这种SN74CBTLV3257的用传输门作为选择器的器件。我输入是1.8v,输出是否可以是3.3v, 上拉电阻是3.3v?
    发表于 12-16 07:30